全面認(rèn)識(shí)JavaScript的Number對(duì)象
首先一個(gè)是對(duì)JavaScript中Number的理解:JavaScript中函數(shù)是一等公民,寫在代碼中的 Array/Object/String/Number/Function等等其實(shí)都是一個(gè)構(gòu)造函數(shù),是用來(lái)生成相應(yīng)的數(shù)據(jù)類型的變量的。
JavaScript的Number對(duì)象是經(jīng)過(guò)封裝的能讓你處理數(shù)字值的對(duì)象。Number對(duì)象由Number()構(gòu)造器創(chuàng)建。
語(yǔ)法:
new Number(value);
// 參數(shù)
value // 被創(chuàng)建對(duì)象的數(shù)字值
Number對(duì)象主要用于:
- 如果參數(shù)無(wú)法被轉(zhuǎn)換為數(shù)字,則返回NaN
- 在非構(gòu)造器上下文中(如:沒(méi)有new操作符),Number能被用來(lái)執(zhí)行類型轉(zhuǎn)換。
========== 屬性 ==========
Number.EPSILON屬性表示1與Number可表示的大于1的最小浮點(diǎn)數(shù)之間的差值。
| 屬性的屬性特性 | 值 |
|---|---|
| writable | false |
| enumerable | false |
| configurable | false |
EPSILON屬性的值接近于2.2204460492503130808472633361816E-16,或者 2^-52。
示例:
let x = 0.2;
let y = 0.3;
let z = 0.1;
console.log(Math.abs(x - y + z) < Number.EPSILON); // true
console.log(Math.abs(x - y + z)); // 2.7755575615628914e-17
console.log(Number.EPSILON); // 2.220446049250313e-16
Number.MAX_SAFE_INTEGER/Number.MIN_SAFE_INTEGER代表在JavaScript中最大/最小的安全的integer型數(shù)字(2^53 - 1/-(2^53 - 1))
| 屬性的屬性特性 | 值 |
|---|---|
| writable | false |
| enumerable | false |
| configurable | false |
MAX_SAFE_INTEGER的值是9007199254740991,形成這個(gè)數(shù)字的原因是JavaScript在IEEE 754中使用double-precision floating-point format numbers(不懂)作為規(guī)定。在這個(gè)規(guī)定中能安全的表示數(shù)字的范圍在-(2^53 - 1)到2^53 - 1之間。
這里安全存儲(chǔ)的意思是指能夠準(zhǔn)確區(qū)分兩個(gè)不相同的值,例如 Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2 將得到 true的結(jié)果,而這在數(shù)學(xué)上是錯(cuò)誤的
Number.MAX_VALUE/Number.MIN_VALUE表示在JavaScript里所能表示的最大/最小數(shù)值。
| 屬性的屬性特性 | 值 |
|---|---|
| writable | false |
| enumerable | false |
| configurable | false |
MAX_VALUE屬性值接近于1.79E+308。大于MAX_VALUE的值代表'Infinity'。
Number.NEGATIVE_INFINITY/Number.POSITIVE_INFINITY屬性表示負(fù)無(wú)窮大/正無(wú)窮大。
| 屬性的屬性特性 | 值 |
|---|---|
| writable | false |
| enumerable | false |
| configurable | false |
Number.NEGATIVE_INFINITY的值和全局對(duì)象Infinity屬性的負(fù)值相同。
該值的行為同數(shù)學(xué)上的無(wú)窮大(infinity)有一點(diǎn)兒不同:
- 任何正值,包括
POSITIVE_INFINITY,乘以NEGATIVE_INFINITY都為NEGATIVE_INFINITY - 任何正值,包括
POSITIVE_INFINITY,乘以POSITIVE_INFINITY都為POSITIVE_INFINITY。 - 任何負(fù)值,包括
NEGATIVE_INFINITY,乘以NEGATIVE_INFINITY都為POSITIVE_INFINITY - 任何負(fù)值,包括
NEGATIVE_INFINITY,乘以POSITIVE_INFINITY都為NEGATIVE_INFINITY - 0 乘以
NEGATIVE_INFINITY/POSITIVE_INFINITY為NaN -
NaN乘以NEGATIVE_INFINITY/POSITIVE_INFINITY為NaN -
NEGATIVE_INFINITY除以任何負(fù)值(除了NEGATIVE_INFINITY)為POSITIVE_INFINITY -
POSITIVE_INFINITY除以NEGATIVE_INFINITY以外的任何負(fù)值為NEGATIVE_INFINITY -
NEGATIVE_INFINITY除以任何正值(除了POSITIVE_INFINITY)為NEGATIVE_INFINITY -
POSITIVE_INFINITY除以POSITIVE_INFINITY以外的任何正值為POSITIVE_INFINITY -
NEGATIVE_INFINITY除以NEGATIVE_INFINITY或POSITIVE_INFINITY是NaN -
POSITIVE_INFINITY除以NEGATIVE_INFINITY或POSITIVE_INFINITY為NaN - 任何數(shù)除以
NEGATIVE_INFINITY/POSITIVE_INFINITY為 0
Number.NaN表示“非數(shù)字”。和NaN相同。
| 屬性的屬性特性 | 值 |
|---|---|
| writable | false |
| enumerable | false |
| configurable | false |
示例:
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991
console.log(Number.MIN_SAFE_INTEGER); // -9007199254740991
console.log(Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2) // true
console.log(Number.MAX_SAFE_INTEGER + 1); // 9007199254740992
console.log(Number.MAX_SAFE_INTEGER + 2); // 9007199254740992 , 加不上去了
console.log(Number.MAX_VALUE); // 1.7976931348623157e+308
console.log(Number.MIN_VALUE); // 5e-324
console.log(Number.MAX_VALUE === Number.MAX_VALUE + 1); // true
console.log(Number.MAX_VALUE + 1); // 1.7976931348623157e+308 ,再加也不會(huì)更大
console.log(Infinity); // Infinity
console.log(Number.MAX_VALUE < Infinity); // true
console.log(Number.POSITIVE_INFINITY); // Infinity
console.log(Number.NEGATIVE_INFINITY); // -Infinity
console.log(Number.POSITIVE_INFINITY === Infinity); // true
console.log(Number.NaN); // NaN
console.log(NaN); // NaN
console.log(Number.NaN === Number.NaN); // false
console.log(Number.NaN === NaN); // false, NaN不等于任何值,包括自身
console.log(Object.is(Number.NaN, NaN)); // true
Number.prototype屬性表示Number構(gòu)造函數(shù)的原型
| 屬性的屬性特性 | 值 |
|---|---|
| writable | false |
| enumerable | false |
| configurable | false |
所有Number實(shí)例都繼承自Number.prototype。
========== 方法 ==========
根據(jù)個(gè)人的理解,將方法進(jìn)行分類
值類型判斷類:isNaN/isFinite/isInteger/isSafeInteger
1.Number.isNaN()確定傳遞的值是否為NaN和其類型是Number。它是原始的全局
isNaN的強(qiáng)大的版本。
語(yǔ)法:
Number.isNaN(value);
// 參數(shù)
value // 要被檢測(cè)是否是NaN的值
// 返回值:一個(gè)布爾值,表示給定的值是否是NaN
附:全局的isNaN()函數(shù)用來(lái)確定一個(gè)值是否為NaN。
語(yǔ)法:
isNaN(testValue);
// 參數(shù)
testValue // 要被檢測(cè)的值
// 返回值:如果給定值為NaN則返回值為true;否則為false
為什么要專門出一個(gè)方法判斷是否是NaN:與JavaScript中其他的值不同,NaN不能通過(guò)相等操作符(== 和 ===)來(lái)判斷,NaN === NaN 和 NaN == NaN都返回false。
NaN值如何產(chǎn)生:
- 當(dāng)算數(shù)運(yùn)算返回一個(gè)未定義的或無(wú)法表示的值時(shí),NaN就產(chǎn)生了。
- 將某些不能強(qiáng)制轉(zhuǎn)換為數(shù)值的非數(shù)值轉(zhuǎn)換為數(shù)值的時(shí)候,也會(huì)得到NaN。
- 0除以0會(huì)返回NaN,但是其他數(shù)除以0則不會(huì)返回NaN。
全局isNaN()的怪異行為:如果isNaN函數(shù)的參數(shù)不是Number,isNaN函數(shù)會(huì)首先嘗試將這個(gè)參數(shù)轉(zhuǎn)換為數(shù)值,然后才會(huì)對(duì)轉(zhuǎn)換后的結(jié)果是否是NaN進(jìn)行判斷。因此,對(duì)于能被強(qiáng)制轉(zhuǎn)換為有效的非NaN數(shù)值來(lái)說(shuō)(空字符串和布爾值分別會(huì)被強(qiáng)制轉(zhuǎn)換為數(shù)值0和1),進(jìn)而會(huì)返回false。這讓人感到怪異,因?yàn)榭兆址黠@不是數(shù)值。這起源于“不是數(shù)值”在基于IEEE-754數(shù)值的浮點(diǎn)計(jì)算體質(zhì)中代表了一種特定的含義。isNaN函數(shù)其實(shí)等同于回答了一個(gè)問(wèn)題:被測(cè)試的值在被強(qiáng)制轉(zhuǎn)換成數(shù)值時(shí),會(huì)不會(huì)返回IEEE-754中所謂的“不是數(shù)值”。
因此,通過(guò)Number.isNaN()來(lái)檢測(cè)是否是一個(gè)NaN是一種更可靠的方法。也可通過(guò)表達(dá)式(x != x)來(lái)檢測(cè)變量x是否是NaN。
Number.isNaN()和isNaN()相比,前者不會(huì)強(qiáng)制將參數(shù)轉(zhuǎn)換成數(shù)字,只有在參數(shù)是真正的數(shù)字類型,且值為NaN的時(shí)候才會(huì)返回true。
Polyfill
var isNaN = function(value) {
let n = Number(value); // 先轉(zhuǎn)換為Number
return n != n; // 利用NaN不等于自身進(jìn)行判斷
}
Number.isNaN = Number.isNaN || function(value) {
//非Number類型直接返回false
return typeof value === 'Number' && isNaN(value);
}
示例:
console.log(isNaN(NaN)); // true
console.log(Number.isNaN(NaN)); // true
console.log(isNaN(37)); // false
console.log(Number.isNaN(37)); // false
console.log(Number.isNaN('37')); // false
console.log(isNaN('37')); // false
console.log(Number.isNaN(undefined)); // false
console.log(isNaN(undefined)); // true
console.log(Number(undefined)); // NaN
console.log(Number.isNaN({})); // false
console.log(isNaN({})); // true
console.log(Number({})); // NaN
console.log(Number.isNaN('37,5')); // false
console.log(isNaN('37,5')); // true
console.log(Number('37,5')); // NaN
console.log(Number.isNaN('123ABC')); // false
console.log(isNaN('123ABC')); // true
console.log(Number('123ABC')); // NaN
console.log(Number.isNaN(new Date().toString())); // false
console.log(isNaN(new Date().toString())); // true
console.log(Number(new Date().toString())); // NaN
console.log(Number.isNaN(true)); // false
console.log(isNaN(true)); // false
console.log(Number(true)); // 1
console.log(Number.isNaN(null)); // false
console.log(isNaN(null)); // false
console.log(Number(null)); // 0
console.log(Number.isNaN('')); // false
console.log(isNaN('')); // false
console.log(Number('')); // 0
console.log(Number.isNaN(' ')); // false
console.log(isNaN(' ')); // false
console.log(Number(' ')); // 0
console.log(Number.isNaN(new Date())) // false
console.log(isNaN(new Date())); // false
console.log(Number(new Date())); // 1558496426074
個(gè)人總結(jié):只要不是NaN任何值放入Number.isNaN()都會(huì)返回false。對(duì)于isNaN()能被Number()轉(zhuǎn)換成數(shù)字的或本身就是數(shù)字返回false,不能轉(zhuǎn)為數(shù)字的會(huì)返回true。(即:如果忽略掉能被轉(zhuǎn)成數(shù)字的字符串,所有數(shù)字對(duì)于isNaN()都返回false,非數(shù)字都返回true)
2.Number.isFinite()用來(lái)檢測(cè)傳入的參數(shù)是否是一個(gè)有窮數(shù)。
語(yǔ)法:
Number.isFinite(value);
// 參數(shù)
value // 要被檢測(cè)有窮性的值。
// 返回值:一個(gè)布爾值表示給定的值是否是一個(gè)有窮數(shù)
附:全局的isFinite()函數(shù)用來(lái)判斷被傳入的參數(shù)值是否是一個(gè)有限數(shù)值。在必要情況下,參數(shù)會(huì)首先轉(zhuǎn)為一個(gè)數(shù)值。
語(yǔ)法:
isFinite(testValue);
// 參數(shù)
testValue // 用來(lái)檢測(cè)有限性的值。
// isFinite 方法檢測(cè)它參數(shù)的數(shù)值。如果參數(shù)是 NaN,正無(wú)窮大或者負(fù)無(wú)窮大,會(huì)返回false,其他返回 true。
Number.isFinite()和全局的isFinite()相比,不會(huì)強(qiáng)制將一個(gè)非數(shù)值的參數(shù)轉(zhuǎn)換成數(shù)值,這就意味著,只有數(shù)值類型的值,且是有窮的,才返回true。
Polyfill
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}
示例:
console.log(Number.isFinite(Infinity)); // false
console.log(isFinite(Infinity)); // false
console.log(Number.isFinite(NaN)); // false
console.log(isFinite(NaN)); // false
console.log(Number.isFinite(2e64)); // true
console.log(isFinite(2e64)); // true
console.log(Number.isFinite('0')); // false
console.log(isFinite('0')); // true
console.log(Number.isFinite(undefined)); // false
console.log(isFinite(undefined)); // false
console.log(Number(undefined)); // NaN
console.log(Number.isFinite(null)); // false
console.log(isFinite(null)); // true
console.log(Number(null)); // 0
個(gè)人總結(jié):只有為Number的值且是有限的時(shí)候Numebr.isFinite()會(huì)返回true。而isFinite()在參數(shù)經(jīng)過(guò)Number轉(zhuǎn)換后再判斷是否是有限的。正無(wú)窮、負(fù)無(wú)窮和NaN都不是有限數(shù)字。
3.Number.isInteger()用來(lái)判斷給定的參數(shù)是否為整數(shù)。
語(yǔ)法:
Number.isInteger(value);
// 返回值:判斷給定的值是否是整數(shù)的Boolean值。如果被檢測(cè)的值是整數(shù),則返回 true,否則返回 false。注意 NaN 和正負(fù) Infinity 不是整數(shù)。
示例:
console.log(Number.isInteger(0)); // true
console.log(Number.isInteger(-0)); // true
console.log(Number.isInteger(0.1)); // false
console.log(Number.isInteger(Math.PI)); // false
console.log(Number.isInteger(Infinity)); // false
console.log(Number.isInteger(-Infinity)); // false
console.log(Number.isInteger(NaN)); // false
console.log(Number.isInteger('10')); // false
console.log(Number.isInteger(true)); // false
console.log(Number.isInteger(false)); // false
console.log(Number.isInteger([1])); // false
個(gè)人總結(jié):只有是Number類型的值并且是整數(shù)才會(huì)返回true,Infinity和NaN都不是整數(shù)。
Polyfill
Number.isInteger = Number.isInteger || function(value) {
return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
}
4.Number.isSafeInteger()用來(lái)判斷傳入的參數(shù)是否是一個(gè)“安全整數(shù)”
比如:2^53-1是一個(gè)安全整數(shù),它能被精確表示,在任何IEEE-754舍入模式下,沒(méi)有其他整數(shù)舍入結(jié)果為該整數(shù)。作為對(duì)比,2^53就不是一個(gè)安全整數(shù),它能夠使用IEEE-754表示,但是2^53+1不能使用IEEE-757直接表示,在就近舍入和向零舍入中,會(huì)被舍入為2^53。
安全整數(shù)范圍為-(2^53-1)到2^53-1之間的整數(shù),包含-(2^53-1)和2^53-1
語(yǔ)法:
Number.isSafeInteger(testValue);
// 返回值:一個(gè)布爾值表示給定的值是否是一個(gè)安全整數(shù)
示例:
console.log(Number.isSafeInteger(3)); // true
console.log(Number.isSafeInteger(Math.pow(2,53))); // false
console.log(Number.isSafeInteger(Math.pow(2,53)-1)); // true
console.log(Number.isSafeInteger(NaN)); // false
console.log(Number.isSafeInteger(Infinity)); // false
console.log(Number.isSafeInteger('3')); // false
console.log(Number.isSafeInteger(3.1)); // false
console.log(Number.isSafeInteger(3.0)); // true
Polyfill
Number.isSafeInteger = Number.isSafeInteger || function(value) {
return Number.isInteger(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER;
}
類型轉(zhuǎn)換類:parseFloat/parseInt
1.Number.parseInt()方法依據(jù)指定基數(shù)[參數(shù)radix的值],把字符串[參數(shù)string的值]解析成整數(shù)。
語(yǔ)法:
Number.parseInt(string[, radix]);
Number.parseInt()與parseInt()函數(shù)是同一個(gè)函數(shù):Number.parseInt === parseInt;// true
附:parseInt()函數(shù)解析一個(gè)字符串參數(shù),并返回一個(gè)指定基數(shù)的整數(shù)。
語(yǔ)法:
parseInt(string, radix);
// 參數(shù)
string // 要被解析的值。如果參數(shù)不是一個(gè)字符串,則將其轉(zhuǎn)換為字符串。字符串開頭的空白符將會(huì)被忽略。
radix // 一個(gè)介于2和36之間的整數(shù),表示上述字符串的基數(shù)。比如參數(shù)'10'表示使用我們通常使用的十進(jìn)制數(shù)值系統(tǒng)。始終指定此參數(shù)可以取消閱讀該代碼時(shí)的困惑并且保證轉(zhuǎn)換結(jié)果可預(yù)測(cè)。當(dāng)未指定基數(shù)時(shí),不同的實(shí)現(xiàn)會(huì)產(chǎn)生不同的結(jié)果,通常將默認(rèn)值認(rèn)為10。
// 返回值:返回解析后的整數(shù)值。如果被解析的第一個(gè)字符無(wú)法被轉(zhuǎn)化成數(shù)值類型,則返回NaN
// 注: radix參數(shù)為n將會(huì)把第一個(gè)參數(shù)看作是一個(gè)數(shù)的n進(jìn)制表示,而返回的值則是十進(jìn)制的。
一些數(shù)中可能包含e字符,使用parseInt去截取包含e字符數(shù)值部分會(huì)造成難以預(yù)料的結(jié)果。
console.log(parseInt('6.022e23', 10)); // 6
console.log(parseInt(6.022e23, 10)); // 6
如果parseInt遇到了不屬于radix參數(shù)所指定的基數(shù)中的字符那么該字符和其后的字符都將被忽略。接著返回已經(jīng)解析的整數(shù)部分。parseInt將截取整數(shù)部分。開頭和結(jié)尾的空白符允許存在,會(huì)被忽略。
console.log(parseInt('F', 16)); // 15
console.log(parseInt('FXX123', 16)); // 15,X和X之后的字符被省略
console.log(parseInt('15 * 3', 10)); // 15
console.log(parseInt(1123, 2)); // 3
在基數(shù)為undefined,或者基數(shù)為0或者沒(méi)有指定的情況下,JavaScript作如下處理:
- 如果字符串string以'0x'或者'0X'開頭,則基數(shù)是16(16進(jìn)制)
- 如果字符串string以'0'開頭,基數(shù)是8(八進(jìn)制)或者10(十進(jìn)制),那么具體是哪個(gè)基數(shù)由實(shí)現(xiàn)環(huán)境決定。ECMAScript 5規(guī)定使用10,但是并不是所有瀏覽器都遵循這個(gè)規(guī)定。因此,永遠(yuǎn)都要給出明確的radix參數(shù)值。
- 如果字符串string以其他任何值開頭,則基數(shù)是10(十進(jìn)制)
console.log(parseInt('012')); // 12
console.log(parseInt('012', 8)); // 10
console.log(parseInt('08')); // 8
console.log(parseInt('08', 8)); // 0
console.log(parseInt('0xF')); // 15
console.log(parseInt('F', 16)); // 15
// 可見chrome瀏覽器認(rèn)為0開頭的基數(shù)是10
如果一個(gè)字符不能被轉(zhuǎn)換成數(shù)字,parseInt返回NaN。 算數(shù)上NaN不是任何一個(gè)進(jìn)制下的數(shù)。
console.log(parseInt('Hello', 8)); // NaN
console.log(parseInt('546', 2)); // NaN
console.log(parseInt('-F', 16)); // -15
console.log(parseInt(' -0F', 16)); // -15
console.log(parseInt(' -0xF ', 16)); // -15
console.log(parseInt('-15e01', 10)); // -15
console.log(parseInt(4.9, 10)); // 4
console.log(parseInt(4.7 * 1e22, 10)); // 4 非常大的數(shù)值變成4
console.log(parseInt(0.00000000000000434, 10)); // 4 非常小的數(shù)值變成4
console.log(parseInt(0.0000000000000034, 10)); // 3 非常小的數(shù)值變成3
console.log(parseInt(0.04, 10)); // 0
一個(gè)更嚴(yán)格的解析函數(shù):MDN上的一個(gè)方法,但是感覺和parseInt差別很大,這個(gè)方法指示找出數(shù)字然后顯示,和進(jìn)制也沒(méi)有太大關(guān)系。
let filterInt = function(value) {
if(/^(\-|\+)?([0-9]+|Infinity)$/.test(value)){
return Number(value);
} else {
return NaN;
}
};
2.Number.parseFloat()可以把一個(gè)字符串解析成浮點(diǎn)數(shù)。該方法和全局parseFloat()函數(shù)相同,并且處于ECMAScript 6 規(guī)范中。
附:parseFloat()函數(shù)解析一個(gè)字符串參數(shù)并返回一個(gè)浮點(diǎn)數(shù)。
語(yǔ)法:
parseFloat(value);
// 參數(shù)
value // 需要被解析成為浮點(diǎn)數(shù)的值
// 返回值:給定值被解析成浮點(diǎn)數(shù),如果給定值不能被轉(zhuǎn)換成數(shù)值,則返回NaN
parseFloat將它的字符串參數(shù)解析成為浮點(diǎn)數(shù)并返回.如果在解析過(guò)程中遇到了正負(fù)號(hào)(+或-),數(shù)字(0-9),小數(shù)點(diǎn),或者科學(xué)記數(shù)法中的指數(shù)(e或E)以外的字符,則它會(huì)忽略該字符以及之后的所有字符,返回當(dāng)前已經(jīng)解析到的浮點(diǎn)數(shù).同時(shí)參數(shù)字符串首位的空白符會(huì)被忽略。
如果參數(shù)字符串的第一個(gè)字符不能被解析成為數(shù)字,則parseFloat返回NaN。
console.log(parseFloat('3.14')) // 3.14
console.log(parseFloat('3.14.15')) // 3.14
console.log(parseFloat('314e-2')) // 3.14
console.log(parseFloat('314e-2e-1')) // 3.14
console.log(parseFloat('0.0314E+2')) // 3.14
console.log(parseFloat('0.0314E+2E+1')) // 3.14
console.log(parseFloat('3.14more non-digit characters')) // 3.14
console.log(parseFloat('FF2')); // NaN
更嚴(yán)格的轉(zhuǎn)換函數(shù):
let filterFloat = function(value) {
if(/^(\-|\+)?|(\.\d+)(\d+(\.\d+)?|(\d+\.)|Infinity)$/
.test(value)){
return Number(value);
} else {
return NaN;
}
}
console.log(filterFloat('3.14')) // 3.14
console.log(filterFloat('3.14.15')) // NaN
console.log(filterFloat('314e-2')) // 3.14
console.log(filterFloat('314e-2e-1')) // NaN
console.log(filterFloat('0.0314E+2')) // 3.14
console.log(filterFloat('0.0314E+2E+1')) // NaN
console.log(filterFloat('3.14more non-digit characters')); // NaN
========== 實(shí)例屬性 =========
Number.prototype.constructor 返回創(chuàng)建該實(shí)例對(duì)象的構(gòu)造函數(shù),默認(rèn)為Number對(duì)象
========= 實(shí)例方法 ==========
所有Number實(shí)例都繼承自Number.prototype。被修改的 Number 構(gòu)造器的原型對(duì)象對(duì)全部 Number 實(shí)例都生效。
修改表示形式類: toExponential/toFixed/toPrecision
1.toFixed()方法使用定點(diǎn)表示法來(lái)格式化一個(gè)數(shù)。
語(yǔ)法:
numObj.toFixed(digits);
// 參數(shù)
digits // 小數(shù)點(diǎn)后數(shù)字的個(gè)數(shù);介于0 到 20(包括)之間,實(shí)現(xiàn)環(huán)境可能支持更大范圍。如果忽略該參數(shù),則默認(rèn)為0。
// 返回值:所給數(shù)值的定點(diǎn)數(shù)表示法的字符串形式
// 拋出異常
rangeError // 如果 digits 參數(shù)太小或太大。0 到 20(包括)之間的值不會(huì)引起 RangeError。實(shí)現(xiàn)環(huán)境(implementations)也可以支持更大或更小的值。
TypeError // 如果該方法在一個(gè)非Number類型的對(duì)象上調(diào)用。
一個(gè)數(shù)值的字符串表現(xiàn)形式,不使用指數(shù)計(jì)數(shù)法,而是在小數(shù)點(diǎn)后有digits位數(shù)字。該數(shù)值在必要時(shí)進(jìn)行四舍五入,另外在必要時(shí)會(huì)用0來(lái)填充小數(shù)部分,以便小數(shù)部分有指定的位數(shù)。如果數(shù)值大于1e+21,該方法會(huì)簡(jiǎn)單調(diào)用Number.prototype.toString()并返回一個(gè)指數(shù)計(jì)數(shù)法格式的字符串。
let numObj = 12345.6789;
console.log(numObj.toFixed()); // '12346'
console.log(numObj.toFixed(1)); // '12345.7'
console.log(numObj.toFixed(6)); // '12345.678900'
console.log((1.23e+20).toFixed(2)); // '123000000000000000000.00'
console.log((1.23e+22).toFixed(2)); // '1.23e+22' 大于1e+21會(huì)返回指數(shù)計(jì)數(shù)法
console.log((1.23e-10).toFixed(2)); // '0.0'
console.log(2.34.toFixed(1)); // '2.3'
console.log(-2.34.toFixed(1)); // -2.3 由于操作符優(yōu)先級(jí),負(fù)數(shù)不會(huì)返回字符串
console.log((-2.34).toFixed(1)); // '-2.3' 若用括號(hào)提高優(yōu)先級(jí),則返回字符串
2.toExponential() 以指數(shù)表示法返回該數(shù)值字符串表示形式。
語(yǔ)法:
numObj.toExponential(fractionDigits);
// 參數(shù)
fractionDigits // 可選。一個(gè)整數(shù),用來(lái)指定小數(shù)點(diǎn)后有幾位數(shù)字。默認(rèn)情況下用盡可能多的位數(shù)來(lái)顯示數(shù)字
// 返回值:一個(gè)用冪的形式來(lái)表示Number對(duì)象的字符串
// 異常
RangeError // 如果 fractionDigits 太小或太大將會(huì)拋出該錯(cuò)誤。介于 0 和 20(包括20)之間的值不會(huì)引起 RangeError 。 執(zhí)行環(huán)境也可以支持更大或更小范圍。
TypeError // 如果該方法在一個(gè)非數(shù)值類型對(duì)象上調(diào)用。
對(duì)數(shù)值字面量使用toExponential()方法,且該數(shù)值沒(méi)有小數(shù)點(diǎn)和指數(shù)時(shí),應(yīng)該在該數(shù)值與該方法之間隔開一個(gè)空格,以避免點(diǎn)號(hào)被解釋為一個(gè)小數(shù)點(diǎn)。也可以使用兩個(gè)點(diǎn)號(hào)調(diào)用該方法。
如果一個(gè)數(shù)值的小數(shù)位數(shù)多于fractionDigits參數(shù)所提供的,則該數(shù)值將會(huì)在fractionDigits指定的小數(shù)位數(shù)處四舍五入(四舍五入規(guī)則參考toFixed方法的描述)。
let numObj = 12345.6789;
console.log(numObj.toExponential()); // '1.23456789e+4'
console.log(numObj.toExponential(1)); // '1.2e+4'
console.log(numObj.toExponential(10)); // '1.2345678900e+4'
console.log( 77.toExponential()); // Uncaught SyntaxError: Invalid or unexpected token
console.log( 77 .toExponential()); // 7.7e+1
console.log( 77..toExponential()); // 7.7e+1
3.toPrecision()以指定的精度返回?cái)?shù)值對(duì)象的字符串表示。
語(yǔ)法:
numObj.toPrecision(precision);
// 參數(shù)
precision // 可選。一個(gè)用來(lái)指定有效數(shù)個(gè)數(shù)的整數(shù)。
// 返回值:以定點(diǎn)表示法或指數(shù)表示法表示的一個(gè)數(shù)值對(duì)象的字符串表示,四舍五入到precision參數(shù)指定的顯示數(shù)字位數(shù)(四舍五入規(guī)則參考toFixed里方法的描述)
// 如果忽略 precision 參數(shù),則該方法表現(xiàn)類似于 Number.prototype.toString()。如果該參數(shù)是一個(gè)非整數(shù)值,將會(huì)向下舍入到最接近的整數(shù)。
// 異常 rangeError
// 如果 precison 參數(shù)不在 1 和 100 (包括)之間,將會(huì)拋出一個(gè) RangeError 。執(zhí)行環(huán)境也可以支持更大或更小的范圍。ECMA-262 只需要最多 21 位顯示數(shù)字。
示例:
let numObj = 12345.6789;
console.log(numObj.toPrecision()); // 12345.6789
console.log(numObj.toPrecision(5)); // 12346
console.log(numObj.toPrecision(10)); // 12345.67890
console.log(numObj.toPrecision(1)); // 1e+4
公有方法: toString/toLocaleString/valueOf
1.toString()返回指定Number對(duì)象的字符串表示形式。
語(yǔ)法:
numObj.toString([radix]);
radix // 指定要用于數(shù)字到字符串的轉(zhuǎn)換的基數(shù)(從2到36)。如果未指定radix參數(shù),則默認(rèn)值為10。
// 異常信息
RangeError // 如果 toString() 的 radix 參數(shù)不在 2 到 36 之間,將會(huì)拋出一個(gè) RangeError。
Number覆蓋了Object對(duì)象上的toString()方法,它不是繼承的Object.prototype.toString()。
如果對(duì)象是負(fù)數(shù),則會(huì)保留負(fù)號(hào)。即使radix是2時(shí)也是如此:返回的字符串包含一個(gè)負(fù)號(hào)(-)前綴和正數(shù)的二進(jìn)制表示,不是數(shù)值的二進(jìn)制補(bǔ)碼。
let count = 10;
console.log(count.toString()); // 10
console.log(17.toString()); // Uncaught SyntaxError: Invalid or unexpected token
console.log(17 .toString()); // 17
console.log((17).toString()); // 17
console.log(17.2.toString()); // 17.2
console.log(254 .toString(16)); // fe
console.log(-10 .toString(2)); // -1010
// 還是要注意點(diǎn)號(hào)的意義
2.toLocaleString()方法涉及到字符編碼,隨后學(xué)習(xí): Number.prototype.toLocaleString
3.valueOf()返回一個(gè)被Number對(duì)象包裝的原始值。
語(yǔ)法:
numObj.valueOf();
// 返回值: 表示指定Number對(duì)象的原始值的數(shù)字
示例:
let numObj = new Number(10);
console.log(typeof numObj); // object
let num = numObj.valueOf();
console.log(num); // 10
console.log(typeof num); // number
console.log(10 .valueOf()); // 10
console.log(typeof 10 .valueOf()); // number
參考文檔:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number