["1", "2", "3"].map(parseInt) 答案是多少?
考察點:1 . ES5的map方法,接收參數並且callback計算並且返回重組。
2 . 這種寫法是個什么概念呢,其實就是["1", "2", "3"].map(parseInt(elem,index,thisArr))
3 . parseInt的參數。
我們一個一個考點說。
1 . ES5的數組操作方法map,用來把每一個根據數組參數經過回掉callback返回一個新數組,callback可以接收三個參數,elem表示數組的元素,index,下表,thisArr,所在的數組。
例如
[ 1 , 2 , 3 ].map(function(elem,index,thisArr){ return elem*index })
就會得出[ 0 , 2 , 6 ],即每一個數組中的元素乘以他的下標。
2 . ["1", "2", "3"].map(parseInt) 會怎么樣呢
parseInt會取整,返回一個整數,字符串變成數字再取整。但是沒有括號是什么鬼。沒有括號,會發生的就是把能傳的參數全傳進去。大不了傳的多了反正不影響,就會發生三次取整。
分別是parseInt("1",0,["1", "2", "3"]),
parseInt("2",1,["1", "2", "3"])
parseInt("3",2,["1", "2", "3"])
然后返回值重組為一個數組。
3 . parseInt的參數。
很少有人知道喪心病狂的parseInt它不好好取整,還有其他的參數,沒錯,它有倆個參數,所以上述的第三個參數是用不到的。
parseInt(string, radix)

多說無益,看看W3C說的,他又是啥子意思捏。以多少來解析,就是多少進制,就是說parseInt("2",4)就是把2用4進制的方式解析成10進制的數字。
意思就是parseInt("1",0) 他會因為radix是0,會解析出來為 1 。
console.log(parseInt(10,2)) //2 以二進制
console.log(parseInt(101,2)) //5 以二進制
console.log(parseInt(101,3)) //10 以三進制
console.log(parseInt(401,36)) //40*36的平方+0*36+1*36的0次方
卧槽?我聽過2 4 8 16 還沒聽過 3 , 36 ,是的,不光有這兩貨,js的parseInt可以解析成2-36的所有進制,原理其實都一樣。
那么所以parseInt( "1" , 0 )是 1 ,parseInt( "2" , 1 ) 是 NaN因為沒有1進制(自己思考1進制怎么玩,這個問題很強大),parseInt( "3" , 2 ) 這個怎么搞,3*2的0次方么 。 應該是 1 啊。
但是一個2進制的數字,他會出現3么,二進制當然全是01010101了。所以3其實是沒有辦法解析的 。 也是NaN 。因為3不是2進制的數字,沒辦法解析成10進制
那么這個題的答案就通了 為 [ 1 , NaN , NaN ] 。
反思:我們可以學到什么呢?
1 . 偉大的ES5數組操作方法還有很多,都挺不錯,反正以前我都手寫過,當時好難受。
2 . ["1", "2", "3"].map(parseInt) 這個沒有參數的調用函數方法有沒有比較炫酷呢,簡單威武,自動傳參,但是也有自己的缺點,有時候雜就不想讓他傳呢
3 . parseInt用法其實很厲害的,可以試試把顏色16進制轉換成rgba那種的。
下面的是用上面的知識寫的16進制顏色轉化rgb
var a = "#ffaacc"; function colorToRGB(color){ var color = color.split("#")[1] var colorArr = [] ; for(var i = 0 ; i<color.length ; i=i+2){ colorArr[i/2] = [ color[i] , color[i+1] ].join("") } return colorArr.map(function(elem){ return parseInt(elem,16) }).toString() } console.log(colorToRGB(a))