['1','2','3'].map(parseInt)
阿新 • • 發佈:2018-11-27
前幾天被問到這個問題,[1,2,3]脫口而出,結果被虐的渣都不剩,首先這個答案肯定是錯的,那麼應該輸出什麼呢?
為啥子會是這樣呢?是因為我沒有理解:
1)map函式傳遞引數的定義,2)parseInt函式針對於radix這個引數的理解。
通常使用map函式的時候都會傳入一個函式,這個函式一般只使用1-2個引數,
let arr = ['1','2','3'].map(function(item){ //1個引數 return item; }); //["1", "2", "3"] let arr = ['1','2','3'].map(function(item, key){ //2個引數 return item+','+key; }); //["1,0","2,1","3,2"]
其實map標準定義是會傳遞3個引數:
arr.map(function(item, key, arr){
...
})
接下來看看parseInt的官方定義:
parseInt(string, radix)
string:需要轉化的字元,如果不是字串會被轉換,忽視空格符。
radix:數字2-36之間的整型。預設使用10,表示10進位制。
這個引數的意義是指把前面的字元看作多少進位制的數字,所謂的基數。
例:
parseInt('123',5)
//將"123"看作5進位制的數,返回十進位制數 38 => 1*5^2 + 2*5^1 + 3*5^0 = 38
如果radix在2-36之外會返回NaN。
在沒有指定基數,或者基數為0的情況下,javascript作如下處理:
如果字串string以 “0x” 或者 “0X” 開頭,則基數是16,16進位制;
如果字串string以 “0” 開頭,基數是8(8進位制)或者10(10進位制),根據實現環境決定。
ECMAScript 5規定使用10,但是並不是所有瀏覽器都遵循這個規定,最好明確給出radix的值。
如果字串string 以其他任何值開頭,則基數是10,10進位制。
所以:
let arr = ['1','2','3'].map(function(item, key, arr){ //3個引數 parseInt("1", 0) //0為10進位制 parseInt("2", 1) //radix中沒有1進位制一說 parseInt("3", 2) //2進制中超過1的值不存在 }); //[1, NaN, NaN]
上圖控制檯的輸出都可以作解釋。
膜拜大佬:
https://www.cnblogs.com/Candybunny/p/5627905.html