像 .map() 這樣的高階函數在 JavaScript 內部是如何運作的?
P粉107772015
P粉107772015 2023-08-25 17:41:30
0
2
434
<p>現在每個人都試圖使用這些高階函數來透過編寫更少的程式碼來獲得有希望的結果。但我想知道這些函數內部是如何運作的。 </p> <p>假設我寫了類似的東西</p> <p> <pre class="brush:js;toolbar:false;">var numbers = [16, 25, 36]; var results = numbers.map(Math.sqrt); console.log(results); // [4, 5, 6]</pre> </p> <p>我知道「number」陣列的每個元素都在逐一迭代,但是<em>如何</em>? </p> <p>我試著去尋找它,但尚未得到滿意的答案。 </p>
P粉107772015
P粉107772015

全部回覆(2)
P粉505450505

我想每個供應商都應該按照 規格

實際實作(例如 V8)可能有點複雜,請參考此答案作為開始。您也可以參考 github 中的 v8 原始碼,但孤立地理解其中的一部分可能並不容易。

引用上面的答案:

ES2015 規格:

  1. O為ToObject(this值)。
  2. ReturnIfAbrupt(O)。
  3. len 為 ToLength(Get(O, "length"))。
  4. ReturnIfAbrupt(len)。
  5. 如果 IsCallable(callbackfn) 為 false,則拋出 TypeError 例外。
  6. 如果提供了 thisArg,則令 TthisArg;否則讓T未定義
  7. A 為 ArraySpeciesCreate(O, len)。
  8. ReturnIfAbrupt(A)。
  9. k為0。
  10. 重複,同時 k len
    1. Pk為ToString(k)。
    2. kPresent為HasProperty(O, Pk)。
    3. ReturnIfAbrupt(kPresent)。
    4. 如果kPresenttrue,則
      1. kValue為Get(O, Pk)。
      2. ReturnIfAbrupt(kValue)。
      3. mappedValue為Call(callbackfn, T, «#kValue, k >,»。
      4. ReturnIfAbrupt(mappedValue)。
      5. 狀態為CreateDataPropertyOrThrow(APkmappedValue)。
      6. ReturnIfAbrupt(狀態)。
    5. k增加1。
  11. 返回A
P粉333395496

.map 只是一個接受回呼、為陣列的每個項目呼叫回呼並將值指派給新陣列的方法。沒什麼特別的。您甚至可以自己輕鬆實現:

Array.prototype.myMap = function(callback) {
  const newArr = [];
  for (let i = 0; i < this.length; i++) {
    newArr.push(callback(this[i], i, this));
  }
  return newArr;
}

var numbers = [16, 25, 36];
var results = numbers.myMap(Math.sqrt);
console.log(results); // [4, 5, 6]
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板