前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >V8引擎对Array.prototype.push的源码实现

V8引擎对Array.prototype.push的源码实现

作者头像
用户3258338
发布2020-09-27 11:27:24
8850
发布2020-09-27 11:27:24
举报

一直非常困惑操作arguments的时候为什么都要用Array.prototype,今天终于明白了。


函数的参数列表 arguments 是一个类数组对象,虽然他也有“下标”,但它并非真正的数组,所以也不能向数组一样,进行排序操作或者往集合中添加一个新的元素。

通常会借用Array.prototype.push:

代码语言:javascript
复制
(function(){
    Array.prototype.push.call(arguments, 3);
    console.log(arguments); 
})()

在操作arguments的时候,经常非常频繁的找Array.prototype对象借用方法。

想把arguments 转成真正的数组的时候,可以借用Array.prototype.slice方法;想截取arguments列表中的头一个元素时,又可以借用Array.prototype.shift方法。那么内部实现原理是什么?让我们来看看V8的引擎源码,以Array.prototype.push为例,看看V8引擎中的具体实现:

代码语言:javascript
复制
function ArrayPush(){
    // 被push的对象的长度;this指向了调用他的对象
    var n = TO_TNIY32( this.lengtt );
    // push的参数个数
    var m = %_ArgumentsLength();
    for (var i=0; i < m; i++){
        // 复制元素
        this[ i + n ] = %_arguments( i );
    }
    this.length = n + m;
    return this.length;
}

以上,Array.prototype.push实际是一个属性复制的过程,把参数按照下标依次添加到被push的对象上面,顺便修改这个对象的length属性。至于被修改的对象是谁,到底是数组还是类数组对象,这一点并不重要。

但是从以上代码可以看出这个对象至少满足:

  • 对象本书要可以存取属性
  • 对象的length属性可读写

参考资料:《Javascript设计模式与开发实践》

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 女程序员的日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档