带有数组原型的javascript对象

时间:2014-12-02 17:54:34

标签: javascript arrays javascript-objects

最近,我读了一篇文章,其中包含以下几行

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

我知道它尝试使用obj作为上下文并将其余部分作为参数传递。之前,我只是将每个项目推送到一个数组中。我很好奇这个实现背后的逻辑是什么。它如何设置索引作为值的每个键以及为什么'length'也会自动添加到对象中?感谢

1 个答案:

答案 0 :(得分:2)

Because that's how push works。大多数数组方法都是有意通用的,因此它们可以应用于其他对象,而不仅仅是数组。

  

当使用零个或多个参数item1,item2等调用push方法时,将执行以下步骤:

     
      
  1. O 成为调用ToObject传递this值作为参数的结果。
  2.   

这只是确保this是一个对象:var O = Object(this);

  
      
  1. lenVal 成为使用参数“length”调用 O 的[[Get]]内部方法的结果。
  2.   

var lenVal = O.length;。在我们的情况下,lenVal将为undefined,因为该对象没有length属性。

  
      
  1. n 成为ToUint32 lenVal )。
  2.   

lenVal转换为数字,并将结果分配给nundefined将转换为0

  
      
  1. items 成为一个内部List,其元素按从左到右的顺序排列为传递给此函数调用的参数。
  2.   

基本上var items = arguments;

  
      
  1. 重复,而项目不为空   
        
    • 中删除第一个元素,并让 E 成为元素的值。
    •   
    • 使用参数ToString n ), E 和{调用 O 的[[Put]]内部方法{1}}。
    •   
    • 将n增加1。
    •   
  2.   

这只是遍历true中的所有条目,分配itemsO[String(n)] = E;。这是您传递给push的每个参数都分配给对象的地方!

  
      
  1. 使用参数“length”, n n += 1调用 O 的[[Put]]内部方法。
  2.   

true设置为lengthn。这是设置O.length = n;的地方!

  
      
  1. 返回 n
  2.