有 3 個函數(shù)可以把非數(shù)值轉換為數(shù)值:Number()、parseInt()和 parseFloat()。第一個函數(shù),即轉型函數(shù) Number()可以用于任何數(shù)據(jù)類型,而另兩個函數(shù)則專門用于把字符串轉換成數(shù)值。這 3 個函數(shù)對于同樣的輸入會有返回不同的結果。
Number()函數(shù)的轉換規(guī)則如下。
- 如果是 Boolean 值,true 和 false 將分別被轉換為 1 和 0。
- 如果是數(shù)字值,只是簡單的傳入和返回。
- 如果是 null 值,返回 0。
- 如果是 undefined,返回 NaN。
- 如果是字符串,遵循下列規(guī)則:
- 如果字符串中只包含數(shù)字(包括前面帶正號或負號的情況),則將其轉換為十進制數(shù)值,即"1"會變成 1,"123"會變成 123,而"011"會變成11(注意:前導的零被忽略了);
- 如果字符串中包含有效的浮點格式,如"1.1",則將其轉換為對應的浮點數(shù)值(同樣,也會忽
略前導零); - 如果字符串中包含有效的十六進制格式,例如"0xf",則將其轉換為相同大小的十進制整
數(shù)值; - 如果字符串是空的(不包含任何字符),則將其轉換為 0;
- 如果字符串中包含除上述格式之外的字符,則將其轉換為 NaN。
- 如果是對象,則調用對象的 valueOf()方法,然后依照前面的規(guī)則轉換返回的值。如果轉換的結果是 NaN,則調用對象的 toString()方法,然后再次依照前面的規(guī)則轉換返回的字符串值。
- 如果字符串中包含有效的浮點格式,如"1.1",則將其轉換為對應的浮點數(shù)值(同樣,也會忽
由于 Number()函數(shù)在轉換字符串時比較復雜而且不夠合理,因此在處理整數(shù)的時候更常用的是parseInt()函數(shù)。parseInt()函數(shù)在轉換字符串時,更多的是看其是否符合數(shù)值模式。它會忽略字符串前面的空格,直至找到第一個非空格字符。如果第一個字符不是數(shù)字字符或者負號,parseInt()就會返回 NaN;也就是說,用parseInt()轉換空字符串會返回 NaN(Number()對空字符返回 0)。如果第一個字符是數(shù)字字符,parseInt()會繼續(xù)解析第二個字符,直到解析完所有后續(xù)字符或者遇到了一個非數(shù)字字符。例如,"1234blue"會被轉換為 1234,因為"blue"會被完全忽略。類似地,"22.5"會被轉換為 22,因為小數(shù)點并不是有效的數(shù)字字符。
??這個函數(shù)提供第二個參數(shù):轉換時使用的基數(shù)(即多少進制)。如果知道要解析的值是十六進制格式的字符串,那么指定基數(shù) 16 作為第二個參數(shù),可以保證得到正確的結果,例如:var num = parseInt("0xAF", 16); //175。實際上,如果指定了 16 作為第二個參數(shù),字符串可以不帶前面的"0x",如下所示:
var num1 = parseInt("AF", 16); //175
var num2 = parseInt("AF"); //NaN
parseFloat()只解析十進制值。輸出可以為整數(shù)。十六進制格式的字符串始終轉化為0。例如:
parseFloat("1.0000"); //輸出1
parseFloat(0xA); // 輸出10,因為輸入為數(shù)字
parseFloat("0xA"); //輸出0,因為輸入為字符串