v8引擎源码—Array.prototype.push实现详解

具体实现如下:

function ArrayPush(){
    var n = TO_UINT32(this.length);  // 被push的对象的length
    var m = %_AraumentsLength();  // push的参数个数
    for(var i=0; i<m; i++){
        this[i+n] = %_Arguments(i);  // 复制元素  (1)
    }
    this.length = n + m;  // 修正length属性的值
    return this.length;
}

从上面的代码可以看出,Array.prototype.push实际上是一个属性复制的过程,把参数按照下标依次添加到被push的对象上面,同时修改了对象的length属性,不需要关注被修改的对象是数组还是类数组。

因此,我们可以把任意类型的对象传入到Array.prototype.push中,比如下面这个例子:

var a = {};
Array.prototype.push.call(a, "first", "second");
console.log(a);

观察上面这个例子我们发现如果要实现javascript中call和apply的区别与联系中"借用其他对象的方法",需要满足下面的条件:

  1. 对象本身可以存取属性;
  2. 对象的length属性可读写;

本篇博客参考自JavaScript设计模式与开发实践,[p33-p34] 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mannuandeyangguang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值