JavaScript 內(nèi)部汗捡,所有數(shù)字都是以64位浮點(diǎn)數(shù)形式儲(chǔ)存,即使整數(shù)也是如此畏纲。所以扇住,1與1.0是相同的,是同一個(gè)數(shù)盗胀。
由于浮點(diǎn)數(shù)不是精確的值艘蹋,所以涉及小數(shù)的比較和運(yùn)算要注意。
0.1 + 0.2 === 0.3
// false
一個(gè)數(shù)在 JavaScript 內(nèi)部實(shí)際的表示形式票灰。
(-1)^符號(hào)位 * 1.xx...xx * 2^指數(shù)位
精度最多只能到53個(gè)二進(jìn)制位簿训,這意味著咱娶,絕對(duì)值小于2的53次方的整數(shù),即-(253-1)到253-1强品,都可以精確表示。
表示方法:
1屈糊、字面形式:十進(jìn)制 十六進(jìn)制等
2的榛、科學(xué)計(jì)數(shù):
123e3 // 123000
123e-3 // 0.123
當(dāng)小數(shù)點(diǎn)前的數(shù)字多于21位或小數(shù)點(diǎn)后的零多于5個(gè),數(shù)值自動(dòng)轉(zhuǎn)為科學(xué)計(jì)數(shù)法表示逻锐。
進(jìn)制:
十進(jìn)制:沒(méi)有前導(dǎo)0的數(shù)值夫晌。
八進(jìn)制:有前綴0o或0O的數(shù)值,或者有前導(dǎo)0昧诱、且只用到0-7的八個(gè)阿拉伯?dāng)?shù)字的數(shù)值晓淀。
十六進(jìn)制:有前綴0x或0X的數(shù)值。
二進(jìn)制:有前綴0b或0B的數(shù)值盏档。
默認(rèn)情況下凶掰,JavaScript 內(nèi)部會(huì)自動(dòng)將八進(jìn)制、十六進(jìn)制蜈亩、二進(jìn)制轉(zhuǎn)為十進(jìn)制懦窘。
特殊數(shù)值:
1、正零和負(fù)零
在JavaScript內(nèi)部稚配,實(shí)際上存在2個(gè)0:一個(gè)是+0畅涂,一個(gè)是-0。它們是等價(jià)的道川。
唯一有區(qū)別的場(chǎng)合是午衰,+0或-0當(dāng)作分母,返回的值是不相等的冒萄。除以正零得到+Infinity臊岸,除以負(fù)零得到-Infinity。
2宦言、Infinity
Infinity表示“無(wú)窮”扇单,用來(lái)表示兩種場(chǎng)景。
一種是一個(gè)正的數(shù)值太大奠旺,或一個(gè)負(fù)的數(shù)值太小蜘澜,無(wú)法表示;
另一種是非0數(shù)值除以0响疚,得到Infinity鄙信。
Infinity有正負(fù)之分,Infinity表示正的無(wú)窮忿晕,-Infinity表示負(fù)的無(wú)窮装诡。
Infinity大于一切數(shù)值(除了NaN),-Infinity小于一切數(shù)值(除了NaN)。
Infinity與NaN比較鸦采,總是返回false宾巍。
四則運(yùn)算:符合無(wú)窮的計(jì)算規(guī)則
5 / Infinity // 0
0 * Infinity // NaN
0 / Infinity // 0
Infinity / 0 // Infinity
Infinity與null計(jì)算時(shí),null會(huì)轉(zhuǎn)成0渔伯,等同于與0的計(jì)算顶霞。
null * Infinity // NaN
null / Infinity // 0
Infinity / null // Infinity
Infinity與undefined計(jì)算,返回的都是NaN锣吼。
Infinity加上或乘以Infinity选浑,返回的還是Infinity。
Infinity減去或除以Infinity玄叠,得到NaN古徒。
isFinite函數(shù)返回一個(gè)布爾值,檢查某個(gè)值是不是正常數(shù)值读恃,而不是Infinity隧膘。
···
isFinite(Infinity) // false
isFinite(-1) // true
isFinite(true) // true
isFinite(NaN) // false
···
3、NaN
NaN是 JavaScript 的特殊值狐粱,表示“非數(shù)字”(Not a Number)
5 - 'x' // NaN
0 / 0 // NaN
NaN不是一種獨(dú)立的數(shù)據(jù)類(lèi)型舀寓,而是一種特殊數(shù)值,它的數(shù)據(jù)類(lèi)型依然屬于Number
NaN不等于任何值肌蜻,包括它本身互墓。
NaN在布爾運(yùn)算時(shí)被當(dāng)作false。
NaN與任何數(shù)(包括它自己)的運(yùn)算蒋搜,得到的都是NaN篡撵。
isNaN方法可以用來(lái)判斷一個(gè)值是否為NaN。
isNaN只對(duì)數(shù)值有效豆挽,如果傳入其他值育谬,會(huì)被先轉(zhuǎn)成數(shù)值。對(duì)于字符串帮哈、對(duì)象和數(shù)組膛檀,isNaN也返回true。
但是娘侍,對(duì)于空數(shù)組和只有一個(gè)數(shù)值成員的數(shù)組咖刃,isNaN返回false。(Number方法的參數(shù)是對(duì)象時(shí)憾筏,將返回NaN嚎杨,除非是包含單個(gè)數(shù)值的數(shù)組。)
isNaN([]) // false
isNaN([123]) // false
isNaN(['123']) // false
判斷NaN更可靠的方法是氧腰,利用NaN是JavaScript之中唯一不等于自身的值這個(gè)特點(diǎn)枫浙,進(jìn)行判斷刨肃。
function myIsNaN(value) {
return value !== value;
}
全局方法:
1、parseInt()
parseInt方法用于將字符串轉(zhuǎn)為整數(shù)箩帚。
如果字符串頭部有空格真友,空格會(huì)被自動(dòng)去除。
如果parseInt的參數(shù)不是字符串膏潮,則會(huì)先轉(zhuǎn)為字符串再轉(zhuǎn)換锻狗。
parseInt(011, 2) // NaN
// 011轉(zhuǎn)為9
parseInt('011', 2) // 3
parseInt('8a') // 8
parseInt('12**') // 12
parseInt('12.34') // 12
parseInt('15e2') // 15
parseInt('15px') // 15
如果字符串的第一個(gè)字符不能轉(zhuǎn)化為數(shù)字(后面跟著數(shù)字的正負(fù)號(hào)除外),返回NaN焕参。
parseInt的返回值只有兩種可能,不是一個(gè)十進(jìn)制整數(shù)油额,就是NaN叠纷。
如果字符串以0x或0X開(kāi)頭,parseInt會(huì)將其按照十六進(jìn)制數(shù)解析潦嘶。
如果字符串以0開(kāi)頭涩嚣,將其按照10進(jìn)制解析。
對(duì)于那些會(huì)自動(dòng)轉(zhuǎn)為科學(xué)計(jì)數(shù)法的數(shù)字掂僵,parseInt會(huì)將科學(xué)計(jì)數(shù)法的表示方法視為字符串航厚,因此導(dǎo)致一些奇怪的結(jié)果。
parseInt(1000000000000000000000.5) // 1
// 等同于
parseInt('1e+21') // 1
parseInt方法還可以接受第二個(gè)參數(shù)(2到36之間)锰蓬,表示被解析的值的進(jìn)制幔睬,返回該值對(duì)應(yīng)的十進(jìn)制數(shù)。
如果第二個(gè)參數(shù)不是數(shù)值芹扭,會(huì)被自動(dòng)轉(zhuǎn)為一個(gè)整數(shù)麻顶。這個(gè)整數(shù)只有在2到36之間,才能得到有意義的結(jié)果舱卡,超出這個(gè)范圍辅肾,則返回NaN。如果第二個(gè)參數(shù)是0轮锥、undefined和null矫钓,則直接忽略。
parseInt('10', 37) // NaN
parseInt('10', 1) // NaN
parseInt('10', 0) // 10
parseInt('10', null) // 10
parseInt('10', undefined) // 10
如果字符串包含對(duì)于指定進(jìn)制無(wú)意義的字符舍杜,則從最高位開(kāi)始新娜,只返回可以轉(zhuǎn)換的數(shù)值。如果最高位無(wú)法轉(zhuǎn)換蝴簇,則直接返回NaN杯活。
parseInt('1546', 2) // 1
parseInt('546', 2) // NaN
2、parseFloat()
parseFloat方法用于將一個(gè)字符串轉(zhuǎn)為浮點(diǎn)數(shù)熬词。
如果字符串符合科學(xué)計(jì)數(shù)法旁钧,則會(huì)進(jìn)行相應(yīng)的轉(zhuǎn)換吸重。
如果字符串包含不能轉(zhuǎn)為浮點(diǎn)數(shù)的字符,則不再進(jìn)行往后轉(zhuǎn)換歪今,返回已經(jīng)轉(zhuǎn)好的部分嚎幸。
parseFloat方法會(huì)自動(dòng)過(guò)濾字符串前導(dǎo)的空格。
如果參數(shù)不是字符串寄猩,或者字符串的第一個(gè)字符不能轉(zhuǎn)化為浮點(diǎn)數(shù)嫉晶,則返回NaN。
parseFloat會(huì)將空字符串轉(zhuǎn)為NaN田篇。
parseFloat() 與 Number() 區(qū)別
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