有 3 個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:Number()挺狰、parseInt()和 parseFloat()刁愿。第一個(gè)函數(shù)慈俯,即轉(zhuǎn)型函數(shù) Number()可以用于任何數(shù)據(jù)類(lèi)型,而另兩個(gè)函數(shù)則專(zhuān)門(mén)用于把字符串轉(zhuǎn)換成數(shù)值宠默。這 3 個(gè)函數(shù)對(duì)于同樣的輸入會(huì)有返回不同的結(jié)果。
Number()函數(shù)的轉(zhuǎn)換規(guī)則如下灵巧。
- 如果是 Boolean 值搀矫,true 和 false 將分別被轉(zhuǎn)換為 1 和 0。
- 如果是數(shù)字值刻肄,只是簡(jiǎn)單的傳入和返回瓤球。
- 如果是 null 值,返回 0肄方。
- 如果是 undefined冰垄,返回 NaN。
- 如果是字符串权她,遵循下列規(guī)則:
- 如果字符串中只包含數(shù)字(包括前面帶正號(hào)或負(fù)號(hào)的情況)虹茶,則將其轉(zhuǎn)換為十進(jìn)制數(shù)值,即"1"會(huì)變成 1隅要,"123"會(huì)變成 123蝴罪,而"011"會(huì)變成11(注意:前導(dǎo)的零被忽略了);
- 如果字符串中包含有效的浮點(diǎn)格式步清,如"1.1"要门,則將其轉(zhuǎn)換為對(duì)應(yīng)的浮點(diǎn)數(shù)值(同樣虏肾,也會(huì)忽
略前導(dǎo)零); - 如果字符串中包含有效的十六進(jìn)制格式欢搜,例如"0xf"封豪,則將其轉(zhuǎn)換為相同大小的十進(jìn)制整
數(shù)值; - 如果字符串是空的(不包含任何字符)炒瘟,則將其轉(zhuǎn)換為 0吹埠;
- 如果字符串中包含除上述格式之外的字符,則將其轉(zhuǎn)換為 NaN疮装。
- 如果是對(duì)象缘琅,則調(diào)用對(duì)象的 valueOf()方法,然后依照前面的規(guī)則轉(zhuǎn)換返回的值廓推。如果轉(zhuǎn)換的結(jié)果是 NaN刷袍,則調(diào)用對(duì)象的 toString()方法,然后再次依照前面的規(guī)則轉(zhuǎn)換返回的字符串值樊展。
- 如果字符串中包含有效的浮點(diǎn)格式步清,如"1.1"要门,則將其轉(zhuǎn)換為對(duì)應(yīng)的浮點(diǎn)數(shù)值(同樣虏肾,也會(huì)忽
由于 Number()函數(shù)在轉(zhuǎn)換字符串時(shí)比較復(fù)雜而且不夠合理呻纹,因此在處理整數(shù)的時(shí)候更常用的是parseInt()函數(shù)。parseInt()函數(shù)在轉(zhuǎn)換字符串時(shí)滚局,更多的是看其是否符合數(shù)值模式居暖。它會(huì)忽略字符串前面的空格,直至找到第一個(gè)非空格字符藤肢。如果第一個(gè)字符不是數(shù)字字符或者負(fù)號(hào)太闺,parseInt()就會(huì)返回 NaN;也就是說(shuō)嘁圈,用parseInt()轉(zhuǎn)換空字符串會(huì)返回 NaN(Number()對(duì)空字符返回 0)省骂。如果第一個(gè)字符是數(shù)字字符,parseInt()會(huì)繼續(xù)解析第二個(gè)字符最住,直到解析完所有后續(xù)字符或者遇到了一個(gè)非數(shù)字字符钞澳。例如,"1234blue"會(huì)被轉(zhuǎn)換為 1234涨缚,因?yàn)?blue"會(huì)被完全忽略轧粟。類(lèi)似地,"22.5"會(huì)被轉(zhuǎn)換為 22脓魏,因?yàn)樾?shù)點(diǎn)并不是有效的數(shù)字字符兰吟。
??這個(gè)函數(shù)提供第二個(gè)參數(shù):轉(zhuǎn)換時(shí)使用的基數(shù)(即多少進(jìn)制)。如果知道要解析的值是十六進(jìn)制格式的字符串茂翔,那么指定基數(shù) 16 作為第二個(gè)參數(shù)混蔼,可以保證得到正確的結(jié)果,例如:var num = parseInt("0xAF", 16); //175
珊燎。實(shí)際上惭嚣,如果指定了 16 作為第二個(gè)參數(shù)遵湖,字符串可以不帶前面的"0x",如下所示:
var num1 = parseInt("AF", 16); //175
var num2 = parseInt("AF"); //NaN
parseFloat()只解析十進(jìn)制值晚吞。輸出可以為整數(shù)延旧。十六進(jìn)制格式的字符串始終轉(zhuǎn)化為0。例如:
parseFloat("1.0000"); //輸出1
parseFloat(0xA); // 輸出10槽地,因?yàn)檩斎霝閿?shù)字
parseFloat("0xA"); //輸出0垄潮,因?yàn)檩斎霝樽址?