在項目開發中咱們常常會用到轉型方法,尤爲是JS這種鬆散型的語言。其中比較經常使用的方法就是Number()方法和ParseInt()/ParseFloat()方法了,下面咱們分別對這幾種方法的轉型機制進行詳細地說明。設計
若是傳入的參數爲字符串,則遵循如下規則:code
若是字符串中只包含數字,則返回相應的數字值(前導的0會被忽略)對象
若是包含浮點和負號,則返回相應的小數或負數ip
若是是16進制數字,則返回相應的10進制數開發
若是包含空格,則開始和結束的空格會被忽略,若是中間包含空格則會返回NaN字符串
若是是空字符串,則返回0console
若是包含除去以上狀況的其它字符,則返回NaN程序設計
若是傳入的參數爲true/false,則返回1/0程序
若是傳入的參數爲null,則返回0方法
若是傳入的參數爲undefined,則返回NaN
若是是數字,則簡單的返回數字值
若是是對象,則調用對象的valueOf()方法,將所得值按照以上規則進行轉型,若是獲得NaN,再調用對象的toString()方法,將所得的值按以上規則進行轉型
整體來講Number()方法的轉型機制比較複雜且難懂,通常咱們手動調用轉型方法會使用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高級程序設計第三版》。