专栏首页女程序员的日常_LinV8引擎对Array.prototype.push的源码实现

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

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


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

通常会借用Array.prototype.push:

(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引擎中的具体实现:

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设计模式与开发实践》

本文分享自微信公众号 - 女程序员的日常(gh_df41d619fb70),作者:凛

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于TCP

    各位宝宝,最近还好吗?现在疫情还不容乐观,生活就是这样疾苦相伴但我们还得做那个身披铠甲与生活厮杀的勇敢者啊~ 唯愿你平安顺遂~

    用户3258338
  • 读书笔记-《了不起的nodejs》-fs、stream

    第一个元素始终是node,第二个元素始终是执行的文件路径,紧接着是命令行后紧跟着的参数。

    用户3258338
  • 原型链

    每个实例对象(object)都有一个私有属性(__proto__)指向其构造函数的原型对象(prototype)。该原型对象也有自己的原型对象,层层向上直到一个...

    用户3258338
  • 5招帮你搞定考前背题,“最强大脑”是如何养成的?

    学习和记忆的某些基本原则是大多数记忆工作的基础。几乎所有用于学习和记忆的基本原则都建立在意义、组织、联想、意象和专注的基础上。

    华章科技
  • Python脚本消费kafka数据

    py3study
  • CopyOnWrite 思想及其应用场景

    CopyOnWrite(简称COW,中文意思是:写入时复制)就是在进行写操作时,先复制要改变的对象,对副本进行写操作,完成对副本的操作后,把原有对象的引用指向副...

    飞狗
  • ONOS集群原理及流程分析

    一、ONOS集群原理简介 ONOS是一个分布式的控制器,为了提高数据的读写效率,采用自实现的基于In-Memory的Key-Value数据存储系统。针对实际的需...

    SDNLAB
  • IT应聘者的简历应该是怎么样的?

    从去年到现在看了几百份简历,包括产品运营和产品设计师的职位。我不是 HR,只是想直接看到求职者的状况,看看是不是要换更准确的渠道去招聘对的人。我看简历的目的也很...

    哲洛不闹
  • [Qt]添加多个状态栏QStatusBar

    原文链接:https://blog.csdn.net/humanking7/article/details/88082382

    祥知道
  • 本周AI热点回顾:给Deepfake 假脸做 X-Ray、飞桨助力打造肺炎筛查和预评估AI系统

    换脸,是滥用深度学习的结果之一。自从 Deepfakes、FaceSwap 等应用开源以后,开发者能自己生成各种换脸视频,网络上也开始流传层出不穷的「假视频」。...

    用户1386409

扫码关注云+社区

领取腾讯云代金券