摘要:報(bào)錯報(bào)錯報(bào)錯有前導(dǎo)的數(shù)值會被視為八進(jìn)制,但是如果前導(dǎo)后面有數(shù)字和,則該數(shù)值被視為十進(jìn)制。對于那些會自動轉(zhuǎn)為科學(xué)計(jì)數(shù)法的數(shù)字,會將科學(xué)計(jì)數(shù)法的表示方法視為字符串,因此導(dǎo)致一些奇怪的結(jié)果。
1.概述
1.1整數(shù)和浮點(diǎn)數(shù)
1.2數(shù)值精度
1.3數(shù)值范圍
2.數(shù)值的表示法
3.數(shù)值的進(jìn)制
4.特殊數(shù)值
4.1正零和負(fù)零
4.2NaN
4.3Infinity
5.與數(shù)值相關(guān)的全局方法
5.1parseInt()
5.2parseFloat()
5.3isNaN()
5.4isFinite()
1.概述
1.1整數(shù)和浮點(diǎn)數(shù)
所有數(shù)字都是以64位浮點(diǎn)數(shù)形式儲存
JavaScript 語言的底層根本沒有整數(shù),所有數(shù)字都是小數(shù)
由于浮點(diǎn)數(shù)不是精確的值,所以涉及小數(shù)的比較和運(yùn)算要特別小心。
0.1 + 0.2 === 0.3
// false
0.3 / 0.1
// 2.9999999999999996
(0.3 - 0.2) === (0.2 - 0.1)
// false
1.2數(shù)值精度
的64個二進(jìn)制位,從最左邊開始,是這樣組成的。
第1位:符號位,0表示正數(shù),1表示負(fù)數(shù)
第2位到第12位(共11位):指數(shù)部分
第13位到第64位(共52位):小數(shù)部分(即有效數(shù)字
如果指數(shù)部分的值在0到2047之間(不含兩個端點(diǎn)),那么有效數(shù)字的第一位默認(rèn)總是1,不保存在64位浮點(diǎn)數(shù)之中
(-1)^符號位 1.xx...xx 2^指數(shù)部分
1.3數(shù)值范圍
64位浮點(diǎn)數(shù)的指數(shù)部分的長度是11個二進(jìn)制位,意味著指數(shù)部分的最大值是2047(2的11次方減1)
64位浮點(diǎn)數(shù)的指數(shù)部分的值最大為2047,分出一半表示負(fù)數(shù),則 JavaScript 能夠表示的數(shù)值范圍為21024到2-1023(開區(qū)間),超出這個范圍的數(shù)無法表示。
如果一個數(shù)大于等于2的1024次方,那么就會發(fā)生“正向溢出”,即 JavaScript 無法表示這么大的數(shù),這時就會返回Infinity。
Math.pow(2, 1024) // Infinity
如果一個數(shù)小于等于2的-1075次方(指數(shù)部分最小值-1023,再加上小數(shù)部分的52位),那么就會發(fā)生為“負(fù)向溢出”,即 JavaScript 無法表示這么小的數(shù),這時會直接返回0。
Math.pow(2, -1075) // 0
var x = 0.5;
for(var i = 0; i < 25; i++) {
x = x * x;
}
x // 0
上面代碼中,對0.5連續(xù)做25次平方,由于最后結(jié)果太接近0,超出了可表示的范圍,JavaScript 就直接將其轉(zhuǎn)為0。
JavaScript 提供Number對象的MAX_VALUE和MIN_VALUE屬性,返回可以表示的具體的最大值和最小值。
Number.MAX_VALUE // 1.7976931348623157e+308
Number.MIN_VALUE // 5e-324
2.數(shù)值的表示法
除了35(十進(jìn)制)和0xFF(十六進(jìn)制)。
數(shù)值也可以采用科學(xué)計(jì)數(shù)法表示,下面是幾個科學(xué)計(jì)數(shù)法的例子。
123e3 // 123000
123e-3 // 0.123
-3.1E+12
.1e-23
科學(xué)計(jì)數(shù)法允許字母e或E的后面,跟著一個整數(shù),表示這個數(shù)值的指數(shù)部分
3.數(shù)值的進(jìn)制
4.特殊數(shù)值
十進(jìn)制:沒有前導(dǎo)0的數(shù)值。
八進(jìn)制:有前綴0o或0O的數(shù)值,或者有前導(dǎo)0、且只用到0-7的八個阿拉伯?dāng)?shù)字的數(shù)值。
十六進(jìn)制:有前綴0x或0X的數(shù)值。
二進(jìn)制:有前綴0b或0B的數(shù)值
如果八進(jìn)制、十六進(jìn)制、二進(jìn)制的數(shù)值里面,出現(xiàn)不屬于該進(jìn)制的數(shù)字,就會報(bào)錯。
0xzz // 報(bào)錯
0o88 // 報(bào)錯
0b22 // 報(bào)錯
有前導(dǎo)0的數(shù)值會被視為八進(jìn)制,但是如果前導(dǎo)0后面有數(shù)字8和9,則該數(shù)值被視為十進(jìn)制。
0888 // 888
0777 // 511
4.1正零和負(fù)零
區(qū)別就是64位浮點(diǎn)數(shù)表示法的符號位不同。它們是等價的。
-0 === +0 // true
0 === -0 // true
0 === +0 // true
幾乎所有場合,正零和負(fù)零都會被當(dāng)作正常的0。
+0 // 0
-0 // 0
(-0).toString() // "0"
(+0).toString() // "0"
唯一有區(qū)別的場合是,+0或-0當(dāng)作分母,返回的值是不相等的。
(1 / +0) === (1 / -0) // false
上面的代碼之所以出現(xiàn)這樣結(jié)果,是因?yàn)槌哉愕玫?Infinity,除以負(fù)零得到-Infinity,這兩者是不相等的(關(guān)于Infinity詳見下文)。
4.2NaN
非數(shù)字
將字符串解析成數(shù)字出錯的場合。
一些數(shù)學(xué)函數(shù)的運(yùn)算結(jié)果會出現(xiàn)NaN。
Math.acos(2) // NaN
Math.log(-1) // NaN
Math.sqrt(-1) // NaN
0除以0也會得到NaN。
0 / 0 // NaN
NaN不等于任何值,包括它本身。
NaN === NaN // false
數(shù)組的indexOf方法內(nèi)部使用的是嚴(yán)格相等運(yùn)算符,所以該方法對NaN不成立。
[NaN].indexOf(NaN) // -1
NaN在布爾運(yùn)算時被當(dāng)作false。
Boolean(NaN) // false
NaN與任何數(shù)(包括它自己)的運(yùn)算,得到的都是NaN。
NaN + 32 // NaN
NaN - 32 // NaN
NaN * 32 // NaN
NaN / 32 // NaN
4.3Infinity
0除以0等于nan
其他0當(dāng)除數(shù)0
0當(dāng)被除數(shù)正 無窮被除為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)運(yùn)算規(guī)則
很普通數(shù)
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.與數(shù)值相關(guān)的全局方法
5.1parseInt(字符串,進(jìn)制數(shù)2-36)
parseInt方法用于將字符串轉(zhuǎn)為整數(shù)
返回nan或者十進(jìn)值
回先string轉(zhuǎn)為字符串再轉(zhuǎn)化
有多少轉(zhuǎn)多少
1.如果字符串頭部有空格,空格會被自動去除。
parseInt(" 81") // 81
2.如果字符串以0x或0X開頭,parseInt會將其按照十六進(jìn)制數(shù)解析。
parseInt("0x10") // 16
如果字符串以0開頭,將其按照10進(jìn)制解析。
parseInt("011") // 11
對于那些會自動轉(zhuǎn)為科學(xué)計(jì)數(shù)法的數(shù)字,parseInt會將科學(xué)計(jì)數(shù)法的表示方法視為字符串,因此導(dǎo)致一些奇怪的結(jié)果。
parseInt(1000000000000000000000.5) // 1
// 等同于
parseInt("1e+21") // 1
parseInt(0.0000008) // 8
// 等同于
parseInt("8e-7") // 8
(2)進(jìn)制轉(zhuǎn)換
如果第二個參數(shù)不是數(shù)值,會被自動轉(zhuǎn)為一個整數(shù)。這個整數(shù)只有在2到36之間,才能得到有意義的結(jié)果,超出這個范圍,則返回NaN。如果第二個參數(shù)是0、undefined和null,則直接忽略。
parseInt("10", 37) // NaN
parseInt("10", 1) // NaN
parseInt("10", 0) // 10
parseInt("10", null) // 10
parseInt("10", undefined) // 10
如果字符串包含對于指定進(jìn)制無意義的字符,則從最高位開始,只返回可以轉(zhuǎn)換的數(shù)值。如果最高位無法轉(zhuǎn)換,則直接返回NaN。
parseInt("1546", 2) // 1
parseInt("546", 2) // NaN
前面說過,如果parseInt的第一個參數(shù)不是字符串,會被先轉(zhuǎn)為字符串。這會導(dǎo)致一些令人意外的結(jié)果。
parseInt(0x11, 36) // 43
parseInt(0x11, 2) // 1
// 等同于
parseInt(String(0x11), 36)
parseInt(String(0x11), 2)
// 等同于
parseInt("17", 36)
parseInt("17", 2)
上面代碼中,十六進(jìn)制的0x11會被先轉(zhuǎn)為十進(jìn)制的17,再轉(zhuǎn)為字符串。然后,再用36進(jìn)制或二進(jìn)制解讀字符串17,最后返回結(jié)果43和1。
這種處理方式,對于八進(jìn)制的前綴0,尤其需要注意。
parseInt(011, 2) // NaN
// 等同于
parseInt(String(011), 2)
// 等同于
parseInt(String(9), 2)
上面代碼中,第一行的011會被先轉(zhuǎn)為字符串9,因?yàn)?不是二進(jìn)制的有效字符,所以返回NaN。如果直接計(jì)算parseInt("011", 2),011則是會被當(dāng)作二進(jìn)制處理,返回3。
5.2parseFloat()
parseFloat方法用于將一個字符串轉(zhuǎn)為浮點(diǎn)數(shù)
1.多少符合轉(zhuǎn)多少
2.如果字符串符合科學(xué)計(jì)數(shù)法,則會進(jìn)行相應(yīng)的轉(zhuǎn)換。
parseFloat("314e-2") // 3.14
parseFloat("0.0314E+2") // 3.14
3.如果參數(shù)不是字符串,或者字符串的第一個字符不能轉(zhuǎn)化為浮點(diǎn)數(shù),則返回NaN 空字符串也是nan
這些特點(diǎn)使得parseFloat的轉(zhuǎn)換結(jié)果不同于Number函數(shù)。
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
假 空數(shù)組 只有一個數(shù)值的數(shù)組
isNaN([]) // false
isNaN([123]) // false
isNaN(["123"]) // false
因此,使用isNaN之前,最好判斷一下數(shù)據(jù)類型。
function myIsNaN(value) {
return typeof value === "number" && isNaN(value);
}
判斷NaN更可靠的方法是,利用NaN為唯一不等于自身的值的這個特點(diǎn),進(jìn)行判斷。
function myIsNaN(value) {
return value !== value;
}
5.4isFinite()
真假,是否正常值
除了Infinity、-Infinity、NaN和undefined這幾個值會返回false
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/106030.html
摘要:數(shù)值轉(zhuǎn)換有個函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值和轉(zhuǎn)型函數(shù)可以用于任何數(shù)據(jù)類型,后面兩個是專門用于把字符串轉(zhuǎn)換為數(shù)值。類型類型用于表示由零或多個位字符組成的字符序列,即字符串。 2.4 數(shù)據(jù)類型 ECMAScript中有5種簡單數(shù)據(jù)類型(基本數(shù)據(jù)類型):Undefined、Null、Boolean、Number和String。還有1種復(fù)雜數(shù)據(jù)類型--Object,Object本質(zhì)上是由一組無序的...
摘要:中的對象其實(shí)就是一組數(shù)據(jù)和功能的集合。對象可以通過執(zhí)行操作符后跟要創(chuàng)建的對象類型的名稱來創(chuàng)建。而創(chuàng)建類型的實(shí)例并為其添加屬性和或方法,就可以創(chuàng)建自定義對象,如下所示 數(shù)據(jù)類型 ECMAscript有五種簡單數(shù)據(jù)類型:Undefined,Null,Boolean,String,Number,還有一種復(fù)雜數(shù)據(jù)類型Object,Object本質(zhì)上是由一組無序的名值組成的. 1.Undefin...
摘要:,返回對象的字符串表示。布爾操作符邏輯非號表示返回一個布爾值,可以應(yīng)用于中的任何值規(guī)則如果操作數(shù)是一個對象,返回如果操作數(shù)是一個空字符串,返回如果操作數(shù)是一個非空字符串,返回如果操作數(shù)是數(shù)值,返回如果操作數(shù)是任 前段時間忙,好久沒更新了,繼續(xù)梳理基礎(chǔ)知識這期總結(jié)的是JS的基本概念 標(biāo)識符 所謂的標(biāo)識符是指變量,函數(shù)屬性的名字,或者函數(shù)的參數(shù) 第一個字符必須是一個字母,下劃線(_)或者一...
摘要:下表給出了各種數(shù)據(jù)類型以及對其對應(yīng)的轉(zhuǎn)換規(guī)則。例如轉(zhuǎn)換為字符串?dāng)?shù)值布爾值對象和字符串值調(diào)用都會返回字符串的一個副本,但和值沒有這個方法。返回對象的字符串?dāng)?shù)值或布爾值表示。 數(shù)據(jù)類型 ECMAScript中有5種簡單的數(shù)據(jù)類型(也稱基本數(shù)據(jù)類型)和 一種復(fù)雜數(shù)據(jù)類型(也稱引用類型) 基本數(shù)據(jù)類型:Undefined、Null、Boolean、Number、String 引用類型:obj...
摘要:目錄語句變量小結(jié)基本語法一是核心知識點(diǎn)的基本語法的第一部分,主要介紹了語句表達(dá)式變量和數(shù)據(jù)類型不包括函數(shù)類型的基本知識點(diǎn),函數(shù)類型將在下一章函數(shù)二中詳細(xì)探討語句程序的執(zhí)行是由一條條語句組成的每一條語句是為完成特定任務(wù)而執(zhí)行的操作語句當(dāng)中可以 目錄 1. 語句 2. 變量 3. 小結(jié) JavaScript基本語法(一)是JavaScript核心知識點(diǎn)(ECMAScript)的基本語法的...
閱讀 866·2021-10-25 09:48
閱讀 625·2021-08-23 09:45
閱讀 2514·2019-08-30 15:53
閱讀 1770·2019-08-30 12:45
閱讀 625·2019-08-29 17:21
閱讀 3430·2019-08-27 10:56
閱讀 2561·2019-08-26 13:48
閱讀 706·2019-08-26 12:24