在專案開發中我們經常會用到轉型方法,尤其是JS這種鬆散型的語言。其中比較常用的方法就是Number()方法和ParseInt()/ParseFloat()方法了,下面我們分別對這幾種方法的轉型機制進行詳細地說明。
Number()
-
如果傳入的引數為字串,則遵循以下規則:
如果字串中只包含數字,則返回相應的數字值(前導的0會被忽略)
如果包含浮點和負號,則返回相應的小數或負數
如果是16進位制數字,則返回相應的10進位制數
如果包含空格,則開始和結束的空格會被忽略,如果中間包含空格則會返回NaN
如果是空字串,則返回0
如果包含除去以上情況的其它字元,則返回NaN
如果傳入的引數為true/false,則返回1/0
如果傳入的引數為null,則返回0
如果傳入的引數為undefined,則返回NaN
如果是數字,則簡單的返回數字值
如果是物件,則呼叫物件的valueOf()方法,將所得值按照以上規則進行轉型,如果得到NaN,再呼叫物件的toString()方法,將所得的值按以上規則進行轉型
總體來說Number()方法的轉型機制比較複雜且難懂,一般我們手動呼叫轉型方法會使用parseInt()/parseFloat()方法進行轉型,下面介紹這兩個方法的轉型機制。
parseInt()/parseFloat()
如果傳入的引數為字串,則則從第0個位置開始,找到第一個非空格字元,如果第一個非空格字元不是數字或-號,則返回NaN,如果是數字或-號,則繼續往下尋找,直到找到非數字字元,然後忽略後面的內容,返回前面找到的數字值(前導的空格會被忽略,中間的空格則會當成非數字字元處理)
如果是boolean,null,undefined型別值,則返回NaN
如果需要對8進位制或者16進位制的數進行轉型,ECMAScript 3和ECMAScript 5有所不同,所以推薦傳入第二個引數,即進位制數
如果是物件,則呼叫物件的toString()方法,將所得值再按照以上方法進行轉型
*以上只說明瞭parseInt()方法的機制,parseFloat()方法與其只有一個區別,即parseFloat()方法遇到第一個浮點會繼續往下尋找
下面舉一些典型的例子,對以上機制進行驗證和說明
console.log(Number("12a")); //NaN
console.log(Number("")); //0
console.log(Number(null)); //0
console.log(Number(undefined)); //NaN
console.log(Number(true)); //1
console.log(Number(false)); //0
console.log(Number([]); //0
console.log(parseInt("-1-2a")); //-1
console.log(parseInt("-a2a")); //NaN
console.log(parseInt(" 12a")); //12
console.log(parseInt("1 2a")); //1
console.log(parseInt("")); //NaN
console.log(parseInt(null)); //NaN
console.log(parseInt(undefined));//NaN
console.log(parseInt(true)); //NaN
console.log(parseInt(false)); //NaN
console.log(parseInt([])); //NaN
以上便是所總結的Number()和parseInt()/parseFloat()方法的轉型機制,特別說明:大部分規則摘自《JavaScript高階程式設計第三版》。