繁体   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