例題: [1,2,3].map(parseInt)
先看看 map 和 parseInt 用法
Array.prototype.map()
語法
array.map(callback[, thisArg])
callback函數的執(zhí)行規(guī)則
參數:自動傳入三個參數
currentValue(當前被傳遞的元素);
index(當前被傳遞的元素的索引);
array(調用map方法的數組)
返回值:對每個傳入callback的數組元素進行處理后,返回的值組成一個新的數組。
callback處理的數組范圍:
只處理有值的索引。沒有被賦值、被delete刪除的索引不會被處理。
在處理過程中新增的元素不會被callback處理。
在處理過程中被刪除的元素不會被callback處理。
在處理過程中被改變的元素,會以callback執(zhí)行到該元素時的值被處理。
tips:綜合2-4條:在callback第一次調用前,已經確定了被處理數組的最大范圍。
thisArg
callback函數被調用時,this會指向thisArg參數所傳的對象;
不向thisArg傳值、或傳的值為null/undefined時,this指向全局對象。
副作用
map方法對原數組不產生影響,(除非callback執(zhí)行時改變了原數組)。
parseInt()
語法
parseInt(string, radix)
參數string
要被解析的值。
該參數可以不是字符串。如果不是字符串,會將其轉換為字符串
字符串開頭的可以有空白,空白會被忽略
參數radix
轉換所采用的基數,2到36之間。
解析規(guī)則
string參數被看做radix指定進制下的數要把它轉換成十進制的整數。
沒有指定基數/基數為0時:
參數string以“0x”或“0X”開頭,radix取16;
參數string以“0”開頭,ECMAScript5規(guī)定radix只能取10,然而ECMAScript3允許radix取8。具體的解析結果依然由實現環(huán)境而定。
其他情況下,radix取10.
基數為1或大于36時:解析結果為NaN。
基數處于2到36之間時:如果string參數的第一個字符(除空白以外),不屬于radix指定進制下的字符,解析結果為NaN;如果第一個字符屬于radix指定進制下的字符,則解析到不屬于radix指定進制下的字符時,將忽略該字符及其后的所有字符。
題目分析
理解了所有背景知識以后,讓我們再來看一下這道題:
["1", "2", "3"].map(parseInt)
考察的知識點為:
1. callback函數自動傳入三個參數:currentValue;index;array。
map方法的callback函數——parseInt方法,在沒有指定傳入的參數的情況下,將自動接收三個參數。在遍歷過程中,parseInt的調用情況如下:
parseInt("1", 0, ["1", "2", "3"])
parseInt("2", 1, ["1", "2", "3"])
parseInt("3", 2, ["1", "2", "3"])
2. parseInt方法接收兩個參數。
第三個參數["1", "2", "3"]將被忽略。parseInt方法將會通過以下方式被調用
parseInt("1", 0)
parseInt("2", 1)
parseInt("3", 2)
3. parseInt的第二個參數radix為0時,ECMAScript5將string作為十進制數字的字符串解析;
parseInt的第二個參數radix為1時,解析結果為NaN;
parseInt的第二個參數radix在2—36之間時,如果string參數的第一個字符(除空白以外),不屬于radix指定進制下的字符,解析結果為NaN。
parseInt("3", 2)執(zhí)行時,由于"3"不屬于二進制字符,解析結果為NaN。
綜上,["1", "2", "3"].map(parse)的返回結果為[1, NaN, NaN]。