1.概述
1.1整數和浮點數
1.2數值精度
1.3數值範圍
2.數值的表示法
3.數值的進制
4.特殊數值
4.1正零和負零
4.2NaN
4.3Infinity
5.與數值相關的全局方法
5.1parseInt()
5.2parseFloat()
5.3isNaN()
5.4isFinite()數組
1.概述
1.1整數和浮點數函數
全部數字都是以64位浮點數形式儲存對象
JavaScript 語言的底層根本沒有整數,全部數字都是小數ip
因爲浮點數不是精確的值,因此涉及小數的比較和運算要特別當心。字符串
0.1 + 0.2 === 0.3
// false數學
0.3 / 0.1
// 2.9999999999999996string
(0.3 - 0.2) === (0.2 - 0.1)
// falseit
1.2數值精度io
的64個二進制位,從最左邊開始,是這樣組成的。function
第1位:符號位,0表示正數,1表示負數
第2位到第12位(共11位):指數部分
第13位到第64位(共52位):小數部分(即有效數字
若是指數部分的值在0到2047之間(不含兩個端點),那麼有效數字的第一位默認老是1,不保存在64位浮點數之中
(-1)^符號位 1.xx...xx 2^指數部分
1.3數值範圍
64位浮點數的指數部分的長度是11個二進制位,意味着指數部分的最大值是2047(2的11次方減1)
64位浮點數的指數部分的值最大爲2047,分出一半表示負數,則 JavaScript 可以表示的數值範圍爲21024到2-1023(開區間),超出這個範圍的數沒法表示。
若是一個數大於等於2的1024次方,那麼就會發生「正向溢出」,即 JavaScript 沒法表示這麼大的數,這時就會返回Infinity。
Math.pow(2, 1024) // Infinity
若是一個數小於等於2的-1075次方(指數部分最小值-1023,再加上小數部分的52位),那麼就會發生爲「負向溢出」,即 JavaScript 沒法表示這麼小的數,這時會直接返回0。
Math.pow(2, -1075) // 0
var x = 0.5;
for(var i = 0; i < 25; i++) {
x = x * x;
}
x // 0
上面代碼中,對0.5連續作25次平方,因爲最後結果太接近0,超出了可表示的範圍,JavaScript 就直接將其轉爲0。
JavaScript 提供Number對象的MAX_VALUE和MIN_VALUE屬性,返回能夠表示的具體的最大值和最小值。
Number.MAX_VALUE // 1.7976931348623157e+308
Number.MIN_VALUE // 5e-324
2.數值的表示法
除了35(十進制)和0xFF(十六進制)。
數值也能夠採用科學計數法表示,下面是幾個科學計數法的例子。
123e3 // 123000
123e-3 // 0.123
-3.1E+12
.1e-23
科學計數法容許字母e或E的後面,跟着一個整數,表示這個數值的指數部分
3.數值的進制
4.特殊數值
十進制:沒有前導0的數值。
八進制:有前綴0o或0O的數值,或者有前導0、且只用到0-7的八個阿拉伯數字的數值。
十六進制:有前綴0x或0X的數值。
二進制:有前綴0b或0B的數值
若是八進制、十六進制、二進制的數值裏面,出現不屬於該進制的數字,就會報錯。
0xzz // 報錯
0o88 // 報錯
0b22 // 報錯
有前導0的數值會被視爲八進制,可是若是前導0後面有數字8和9,則該數值被視爲十進制。
0888 // 888
0777 // 511
4.1正零和負零
區別就是64位浮點數表示法的符號位不一樣。它們是等價的。
-0 === +0 // true
0 === -0 // true
0 === +0 // true
幾乎全部場合,正零和負零都會被看成正常的0。
+0 // 0
-0 // 0
(-0).toString() // '0'
(+0).toString() // '0'
惟一有區別的場合是,+0或-0看成分母,返回的值是不相等的。
(1 / +0) === (1 / -0) // false
上面的代碼之因此出現這樣結果,是由於除以正零獲得+Infinity,除以負零獲得-Infinity,這二者是不相等的(關於Infinity詳見下文)。
4.2NaN
非數字
將字符串解析成數字出錯的場合。
一些數學函數的運算結果會出現NaN。
Math.acos(2) // NaN
Math.log(-1) // NaN
Math.sqrt(-1) // NaN
0除以0也會獲得NaN。
0 / 0 // NaN
NaN不等於任何值,包括它自己。
NaN === NaN // false
數組的indexOf方法內部使用的是嚴格相等運算符,因此該方法對NaN不成立。
[NaN].indexOf(NaN) // -1
NaN在布爾運算時被看成false。
Boolean(NaN) // false
NaN與任何數(包括它本身)的運算,獲得的都是NaN。
NaN + 32 // NaN
NaN - 32 // NaN
NaN * 32 // NaN
NaN / 32 // NaN
4.3Infinity
0除以0等於nan
其餘0當除數0
0當被除數正 無窮被除爲0
0 * Infinity // NaN
1 / -0 // -Infinity
-1 / -0 // Infinity
Infinity與NaN比較,老是返回false。
Infinity > NaN // false
-Infinity > NaN // false
Infinity < NaN // false
-Infinity < NaN // false
(2)運算規則
很普通數
5 * Infinity // Infinity
5 - Infinity // -Infinity
Infinity / 5 // Infinity
5 / Infinity // 0
跟0
0 * Infinity // NaN
0 / Infinity // 0
Infinity / 0 // Infinity
加減乘除
Infinity - Infinity // NaN
Infinity / Infinity // NaN
Infinity + Infinity // Infinity
Infinity * Infinity // Infinity
5.與數值相關的全局方法
5.1parseInt(字符串,進制數2-36)
parseInt方法用於將字符串轉爲整數
返回nan或者十進值
回先string轉爲字符串再轉化
有多少轉多少
1.若是字符串頭部有空格,空格會被自動去除。
parseInt(' 81') // 81
2.若是字符串以0x或0X開頭,parseInt會將其按照十六進制數解析。
parseInt('0x10') // 16
若是字符串以0開頭,將其按照10進制解析。
parseInt('011') // 11
對於那些會自動轉爲科學計數法的數字,parseInt會將科學計數法的表示方法視爲字符串,所以致使一些奇怪的結果。
parseInt(1000000000000000000000.5) // 1
// 等同於
parseInt('1e+21') // 1
parseInt(0.0000008) // 8
// 等同於
parseInt('8e-7') // 8
(2)進制轉換
若是第二個參數不是數值,會被自動轉爲一個整數。這個整數只有在2到36之間,才能獲得有意義的結果,超出這個範圍,則返回NaN。若是第二個參數是0、undefined和null,則直接忽略。
parseInt('10', 37) // NaN
parseInt('10', 1) // NaN
parseInt('10', 0) // 10
parseInt('10', null) // 10
parseInt('10', undefined) // 10
若是字符串包含對於指定進制無心義的字符,則從最高位開始,只返回能夠轉換的數值。若是最高位沒法轉換,則直接返回NaN。
parseInt('1546', 2) // 1
parseInt('546', 2) // NaN
前面說過,若是parseInt的第一個參數不是字符串,會被先轉爲字符串。這會致使一些使人意外的結果。
parseInt(0x11, 36) // 43
parseInt(0x11, 2) // 1
// 等同於
parseInt(String(0x11), 36)
parseInt(String(0x11), 2)
// 等同於
parseInt('17', 36)
parseInt('17', 2)
上面代碼中,十六進制的0x11會被先轉爲十進制的17,再轉爲字符串。而後,再用36進制或二進制解讀字符串17,最後返回結果43和1。
這種處理方式,對於八進制的前綴0,尤爲須要注意。
parseInt(011, 2) // NaN
// 等同於
parseInt(String(011), 2)
// 等同於
parseInt(String(9), 2)
上面代碼中,第一行的011會被先轉爲字符串9,由於9不是二進制的有效字符,因此返回NaN。若是直接計算parseInt('011', 2),011則是會被看成二進制處理,返回3。
5.2parseFloat()
parseFloat方法用於將一個字符串轉爲浮點數
1.多少符合轉多少
2.若是字符串符合科學計數法,則會進行相應的轉換。
parseFloat('314e-2') // 3.14
parseFloat('0.0314E+2') // 3.14
3.若是參數不是字符串,或者字符串的第一個字符不能轉化爲浮點數,則返回NaN 空字符串也是nan
這些特色使得parseFloat的轉換結果不一樣於Number函數。
parseFloat(true) // NaN
Number(true) // 1
parseFloat(null) // NaN
Number(null) // 0
parseFloat('') // NaN
Number('') // 0
parseFloat('123.45#') // 123.45
Number('123.45#') // NaN
5.3isNaN()
Nan===nan假
isNaN(NaN) // true
先number()再判斷
真 字符串 對象 undefined
假 空數組 只有一個數值的數組
isNaN([]) // false
isNaN([123]) // false
isNaN(['123']) // false
所以,使用isNaN以前,最好判斷一下數據類型。
function myIsNaN(value) {
return typeof value === 'number' && isNaN(value);
}
判斷NaN更可靠的方法是,利用NaN爲惟一不等於自身的值的這個特色,進行判斷。
function myIsNaN(value) {
return value !== value;
}
5.4isFinite()
真假,是否正常值 除了Infinity、-Infinity、NaN和undefined這幾個值會返回false