簡體   English   中英

具有數組原型的javascript對象

[英]javascript object with array prototype

最近,我閱讀了一篇包含以下內容的文章

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

我知道它嘗試使用obj作為上下文,並將其余的作為參數傳遞。 在此之前,我只用於將每個項目壓入數組。 我很好奇此實現背后的邏輯是什么。 如何將index設置為值的每個鍵,以及為什么還會將'length'自動添加到對象? 謝謝

因為這就是push方式 大多數數組方法是有意通用的,因此它們可以應用於其他對象,而不僅是數組。

當使用零個或多個參數item1,item2等調用push方法時,將執行以下步驟:

  1. O為調用ToObject並將this值作為參數傳遞的結果。

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

  1. lenVal為使用參數“ length”調用O的[[Get]]內部方法的結果。

var lenVal = O.length; 在本例中, lenVal將是undefined ,因為該對象沒有length屬性。

  1. nToUint32lenVal )。

lenVal轉換為數字並將結果分配給n undefined將轉換為0

  1. item為內部List,其元素按從左到右的順序是傳遞給此函數調用的參數。

基本上var items = arguments;

  1. 重復,但項目不為空
    • 項目中刪除第一個元素,並讓E為元素的值。
    • 使用參數ToStringn ), Etrue調用O的[[Put]]內部方法。
    • n增加1。

這將簡單地遍歷items所有條目,分配O[String(n)] = E; n += 1 這是您傳遞給push的每個參數都分配給該對象的地方!

  1. 用參數“ length”, ntrue調用O的[[Put]]內部方法。

length設置為nO.length = n; 這是設置length地方!

  1. 返回n

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM