2015-04-04 45 views
1

我想Concat的一個arguments對象與另一個數組,我寫了這樣的代碼:爲什麼我無法在JavaScript中使用concat方法將「參數」對象轉換爲數組?

[].concat.call(arguments, newArray) 

但它返回[ [object Arguments], ... ],這正是不是我想要的。我用Google搜索,發現爲什麼我可以通過切片方法做一些解釋:How can I convert the "arguments" object to an array in JavaScript?

但擡頭規範後,我發現concat方法相同的定義:

注意concat功能有意通用的;它不要求它的這個值是一個Array對象。因此可以將其轉換爲其他類型的對象以用作方法。 concat函數是否可以成功應用於主機對象取決於實現。

該規範是在這裏:http://es5.github.io/#x15.4.4.4

所以現在我困惑,爲什麼我不能通過concat方法arguments對象轉換爲數組。

+0

*「和我寫了這樣的代碼」 *什麼是'newArray'? – 2015-04-04 12:44:32

+0

看看步驟5b和5c。這就是爲什麼。該說明似乎與算法不同,但筆記明​​顯是非正式的。 – 2015-04-04 12:48:08

+0

這是另一個數組,如'[1,2,3]'。 – 2015-04-04 12:49:03

回答

2

的細節可以在§15.4.4.4 of the spec找到。基本上,它創建的事情列出來處理,在列表中的第一項是你叫它的對象(this),然後在列表上後續項目的函數的自變量開始了。然後它遍歷列表並處理每個項目。它有它該列表不在陣列上的項目明確的分支,而「其他」的一個分支,是(步驟5(C)):

  • 否則,E是不是數組
    • 呼叫甲以ToString(n)的[[DefineOwnProperty]]內部方法,屬性描述符{[[價值]]:E,[[可寫]]:真,[可枚舉]]:真,[[可配置]]:true}和false。 1。
非陣列上

所以你可以呼叫concat

  • 增加ñ。它不會失敗。但它並不像數組那樣將非數組類似的事物處理。

    注意Felix's observation,這種「只陣列得到他們的作品攤開」正在改變ES6。 concat對象上採用了全新的"is concat spreadable" flag,以確定它是否應該通過他們的作品循環。我不認爲arguments對象會擁有該標誌,但(至少我在§9.4.4中看不到任何內容),可能是爲了避免向後兼容問題。

  • +0

    感謝您的解釋。看來我已經提出了一個愚蠢的問題:P – 2015-04-04 13:21:34

    +1

    @DolphinWood:我不會那麼說。閱讀規範並不容易(不幸的是,這種情況越來越嚴重,並不是更好 - ES6規範使得ES5規範看起來像一本兒童書!)。 – 2015-04-04 13:33:04

    相關問題