专栏首页女程序员的日常_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 条评论
登录 后参与评论

相关文章

  • JavaScript中的 Call 和 Apply

    Function.prototype.call 和 Function.prototype.apply都是非常常用的方法,它们的作用一模一样,区别仅在于传入参数形...

    越陌度阡
  • js引擎v8源码解析之对象第一篇(基于v8 0.1.5)

    我们看到类中有一个静态属性kSize,这个属性是标记该类的对象,属性需要占据的内存字节大小。下面我们看第一个继承于Object的类Smi。Smi是表示小整形。我...

    theanarkh
  • js引擎v8源码解析之map对象上篇(基于v8 0.1.5)

    从上面的代码中我们知道,只是对某些属性或标记进行读写。根据对象的内存布局对号入座就行,至于每个属性和标记的意义,后续再慢慢探讨。map还有很多函数,但是会涉及很...

    theanarkh
  • js引擎v8源码解析之对象第二篇(基于v8 0.1.5)

    我们发现数组的对象内存布局中,只有一个属性。就是保存length大小的。首先看看读写length属性的实现。

    theanarkh
  • js引擎v8源码解析之对象第三篇(基于v8 0.1.5)

    我们从代码可以知道,这几个类没有太多的逻辑,都有一系列的属性和对应的读写函数。对号入座就行。

    theanarkh
  • js引擎v8源码解析之对象第四篇(基于v8 0.1.5)

    SemiSpace他自己不申请内存。他是负责管理某块内存的,内存申请在其他地方处理。

    theanarkh
  • day027: 能不能实现数组 push、pop 方法 ?

    用户3806669
  • 信息论IV:宿主、时空置换、V8玄学

    字符串类型通过修剪utf8的Huffman树,让所有的叶子成为独立的编码对象,虽然牺牲了一定的时间,却让minUTF8成为信息论上最优的字符编码。接下来研究研究...

    Jean
  • Firefox信息泄漏漏洞的技术分析(CVE-2018-12387)

    研究发现,JavaScript JIT编辑器中的Array.prototype.push有多个存在安全问题的参数,而这些参数共同导致了这个信息泄漏漏洞的出现。这...

    FB客服
  • Google V8 引擎

    V8的前世今生 V8是JavaScript渲染引擎,第一个版本随着Chrome的发布而发布(具体时间为2008年9月2日)。在运行JavaScript之前,相比...

    xiangzhihong
  • Google V8引擎

    V8的前世今生 V8是JavaScript渲染引擎,第一个版本随着Chrome的发布而发布(具体时间为2008年9月2日)。在运行JavaScript之前,相比...

    xiangzhihong
  • 探究JS V8引擎下的“数组”底层实现

    JavaScript 中的数组有很多特性:存放不同类型元素、数组长度可变等等,这与数据结构中定义的数组结构或者C++、Java等语言中的数组不太一样,那么JS数...

    2020labs小助手
  • JavaScript深入浅出第4课:V8引擎是如何工作的?

    大神Fabrice Bellard发布了一个新的JS引擎QuickJS,可以将JavaScript源码转换为C语言代码,然后再使用系统编译器(gcc或者clan...

    Fundebug
  • V8系统解读(一): V8 在 Chrome 中的位置&编译调试V8

    这是一套关于 Chrome 中的 JS 引擎 V8 的文章系列。谈到 V8 ,估计大部分人会一种畏惧感,首先映入脑海的便是天花乱坠的 C++ 源码,但其实就算你...

    用户3806669
  • 浏览器之 javaScript 引擎

    而【WebKit 技术内幕】是基于 WebKit 的 Chromium 项目的讲解。

    夜尽天明
  • JavaScript 引擎和 Just-in-Time 编译概念,Hot Function 的简单介绍

    原文:JavaScript engines and Just-In-Time compilation: A beginner’s exploration, pa...

    Jerry Wang
  • 揭秘:支付宝小程序 V8 Worker 技术演进

    阿里妹导读:本文分享支付宝小程序 V8 Worker 相关工作沉淀和总结,包括技术演进、基础架构、基础功能、以及 JS 引擎能力输出,以及一些优化方案等。欢迎同...

    lucifer210
  • JavaScript是如何工作的:深入V8引擎&编写优化代码的5个技巧

    JavaScript 引擎是执行 JavaScript 代码的程序或解释器。JavaScript 引擎可以实现为标准解释器,或者以某种形式将 JavaScrip...

    Javanx
  • JavaScript 引擎 V8 执行流程概述

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/t__Jqzg1rbTlsCHXKMwh6A 作者:赖...

    2020labs小助手

扫码关注云+社区

领取腾讯云代金券