摘要:報錯報錯報錯有前導的數值會被視為八進制,但是如果前導后面有數字和,則該數值被視為十進制。對于那些會自動轉為科學計數法的數字,會將科學計數法的表示方法視為字符串,因此導致一些奇怪的結果。
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 語言的底層根本沒有整數,所有數字都是小數
由于浮點數不是精確的值,所以涉及小數的比較和運算要特別小心。
0.1 + 0.2 === 0.3
// false
0.3 / 0.1
// 2.9999999999999996
(0.3 - 0.2) === (0.2 - 0.1)
// false
1.2數值精度
的64個二進制位,從最左邊開始,是這樣組成的。
第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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106030.html
摘要:數值轉換有個函數可以把非數值轉換為數值和轉型函數可以用于任何數據類型,后面兩個是專門用于把字符串轉換為數值。類型類型用于表示由零或多個位字符組成的字符序列,即字符串。 2.4 數據類型 ECMAScript中有5種簡單數據類型(基本數據類型):Undefined、Null、Boolean、Number和String。還有1種復雜數據類型--Object,Object本質上是由一組無序的...
摘要:中的對象其實就是一組數據和功能的集合。對象可以通過執行操作符后跟要創建的對象類型的名稱來創建。而創建類型的實例并為其添加屬性和或方法,就可以創建自定義對象,如下所示 數據類型 ECMAscript有五種簡單數據類型:Undefined,Null,Boolean,String,Number,還有一種復雜數據類型Object,Object本質上是由一組無序的名值組成的. 1.Undefin...
摘要:目錄語句變量小結基本語法一是核心知識點的基本語法的第一部分,主要介紹了語句表達式變量和數據類型不包括函數類型的基本知識點,函數類型將在下一章函數二中詳細探討語句程序的執行是由一條條語句組成的每一條語句是為完成特定任務而執行的操作語句當中可以 目錄 1. 語句 2. 變量 3. 小結 JavaScript基本語法(一)是JavaScript核心知識點(ECMAScript)的基本語法的...
閱讀 819·2021-10-25 09:48
閱讀 611·2021-08-23 09:45
閱讀 2496·2019-08-30 15:53
閱讀 1759·2019-08-30 12:45
閱讀 586·2019-08-29 17:21
閱讀 3407·2019-08-27 10:56
閱讀 2547·2019-08-26 13:48
閱讀 691·2019-08-26 12:24