如果你遇到 CreateListFromArrayLike 的報錯的話,那麼可以看看代碼裡面調用 apply 方法的地方,call 是用 0 個或者更多的參數,而 apply 則是用一個數組。
如果你遇到 CreateListFromArrayLike 的報錯的話,那麼可以看看代碼裡面調用 apply 方法的地方,call 是用 0 個或者更多的參數,而 apply 則是用一個數組。
錯誤例子
Math.max.apply(null, 1, 2, 3);
// Uncaught TypeError: CreateListFromArrayLike called on non-object
正確例子
Math.max.call(null, 1, 2, 3); // 3
Math.max.apply(null, [1, 2, 5, 10]); // 10
解釋
當調用 Function.prototype.apply
的時候,它會調用內置抽象操作 CreateListFromArrayLike。
CreateListFromArrayLike
CreateListFromArrayLike ( obj [ , elementTypes ] )
CreateListFromArrayLike 是一個 ECMAScript 的內置抽象操作 (Abstract Operation),用於建立一個 List 的值,它的元素由類似數組的對象的索引屬性提供。elementTypes
是一個 List,只允許自身建立的 list
擁有 ECMAScript Language 類型的值,比如undefined, null, boolean
等。在調用的時候,它會執行以下步驟:
- 如果沒有定義
elementTypes
的話,它會被定義為 Undefined, Null, Boolean, String, Symbol, Number, Object 。 - 如果
Type(obj)
的類型不是 Object,拋出 TypeError 錯誤。 - 定義
len
為obj
的 length。 - 建立一個空的 List
list
。 - 定義
index
為 0 - 當 index 小於 len 的時候,重複以下步驟:
- 定義
indexName
為!ToString(index) - 定義
next
為?Get(obj, indexName) - 如果
Type(next)
的類型不存在於elementType
裡面,拋出 TypeError 錯誤。 - 在
list
的最後增加 next (list.push(next)
) index
的值加 1
- 定義
- 返回
list
參考資料
感謝您閱讀我的文章。歡迎隨時分享你的想法。