2014-12-02 81 views
0

最近,我讀到了以下行JavaScript對象與數組原型

var obj = {}; 
Array.prototype.push.call(obj, 'aaa', 'bbb', 'ccc'); 
console.log(obj); 
{0: "aaa", 1: "bbb", 2: "ccc", length: 3} 

我知道它會嘗試使用OBJ的背景和經過,其餘爲參數的文章。之前,我只是用來將每個項目推送到一個數組中。我很好奇這個實現背後的邏輯是什麼。它如何將索引設置爲值的每個鍵以及爲什麼「長度」自動添加到對象?謝謝

+2

因爲這push'如何'工作:http://es5.github.io/#x15.4.4.7 – 2014-12-02 17:57:36

+1

事實上,許多陣列方法是......「故意通用的,不要求他們的'this'值是一個Array對象',引用了同一個文檔。 – raina77ow 2014-12-02 18:03:36

回答

2

Because that's how push works。大多數數組方法都是有意通用的,所以它們可以應用於其他對象,而不僅僅是數組。

當推方法被稱爲具有零個或多個參數ITEM1,ITEM2,等等,都採取以下步驟:

  1. ö是主叫ToObject傳遞this值的結果作爲論據。

這只是確保this是一個對象:var O = Object(this);

  • lenVal是調用[[獲取]]內部方法的結果O,參數「length」。
  • var lenVal = O.length;lenVal在我們的例子中將爲undefined,因爲該對象沒有length屬性。

  • ÑToUint32lenVal)。
  • lenVal轉換爲數字,並將結果n分配。 undefined將被轉換爲0

  • 是一個內部列表,其元素,在從左到右的順序,被傳遞給該函數調用,該參數。
  • 基本上var items = arguments;

  • 重複,而不爲空
    • 取下第一元件和讓Ë是該元素的值。
    • 呼叫的ö與參數的[[把]]內部方法ToStringÑÈ,和true
    • 增加n加1。
  • 這僅僅遍歷所有條目中items,分配O[String(n)] = E;n += 1。這是您傳遞給每個推送參數的地方!

  • 調用[[把]的ö與參數 「長度」,Ñ,和true內部方法。
  • lengthnO.length = n;。這是length設置的地方!

  • 返回Ñ
  • +0

    這是一個非常詳細的解釋。您的評論比ECMA5指令更具可讀性。非常感謝 – eded 2014-12-02 18:48:14