我遇到了一個 JavaScript 代碼,它創建一個陣列并用 0-9 的數字填充它。
代碼是:
var arr = Array.apply(null, {length: 10}).map(Number.call, Number);
console.log(arr);
上面的代碼創建了一個陣列并將 0-9 的數字壓入其中。我不明白它是如何作業的。我知道這里使用的所有方法,例如apply, map,call但仍然不明白它是如何作業的。
任何人都可以通過將代碼分成塊來解釋代碼的作業嗎?就像逐步執行代碼的方式以及它如何生成一個包含 0-9 數字的陣列一樣。
uj5u.com熱心網友回復:
首先,您的代碼創建了一個包含 10 個元素的陣列,所有這些元素都undefined使用以下代碼:
Array.apply(null, {length: 10})
上面就像寫:
Array(undefined, undefined, undefined, undefined, ... 6 more times ...)
這是有效的,因為該物件{length: 10}類似于陣列,因為它有一個length屬性。通常, to 的第二個引數.apply()是您要用來呼叫函式的引數陣列。但是,在這種情況下,當您傳遞一個物件時,JS 會使用 length 屬性并Array()使用 10 個undefined引數呼叫該函式,因為該{length: 10}物件的鍵沒有定義0to的屬性值9。
接下來,undefined映射包含 10 個值的陣列。使用時.map(),第一個引數是映射函式,方法的第二個引數.map()是this引數,它指示this應該在第一個映射函式內部參考什么。查看 map 方法的一種方法是像這樣重寫它:
.map((element, index, array) => Number.call(element, index, array))
該.map()方法將遍歷您的所有 10 個undefined元素,并且對于每個元素,您的回呼將使用該index元素的呼叫。當使用Number.call()時,this該Number()函式呼叫設定為undefined(即:element)。這不會影響呼叫的Number()行為方式,因為它的執行不依賴于任何特定值。結果,上面的Number.call方法和 using 一樣Number(index, array), wherearray被丟棄了,所以就簡單的執行了Number(index)。
該.map()方法的第二個引數是定義this傳遞給該.map()方法的第一個映射函式的系結。當您Number.call作為映射函式傳遞時,您傳遞的是對在 上call定義的方法的參考Function.prototype.call。該call方法僅根據this呼叫該.call()方法時定義的值知道它應該呼叫哪個函式。由于您只是向.map()方法傳遞對call()函式的參考,而不是使用 呼叫它(),因此this丟失了,因此您需要明確定義該this值是什么。這可以通過Number將第二個引數傳遞給 map 方法呼叫來完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/351768.html
下一篇:如何使用二維陣列作為輸入?
