V8引擎对Array.prototype.push的源码实现
时间:2022-07-25
本文章向大家介绍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设计模式与开发实践》
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python+selenium 自动化-模拟键盘输入、点击操作,如何查看所支持的全部键位名称
- Uber为什么放弃Postgres选择迁移到MySQL?
- BAT 批处理命令 - 文件批量复制、克隆功能实例演示
- 【35期】谈谈你对Java线程之间通信方式的理解
- mac 技术篇-修改hosts文件,hosts文件位置
- 一行能装逼的 JavaScript 代码
- python 技术篇-时间戳的获取,记录程序处理时间
- 基于SpringBoot AOP面向切面编程实现Redis分布式锁
- Python+Selenium 技巧篇-svg标签内元素的xpath定位方式
- 小书MybatisPlus第5篇-Active Record模式精讲
- Python 语法问题-module ‘pip._internal‘ has no attribute ‘pep425tags‘. 原因及解决办法,32位、64位查看pip支持万能方法
- 总在说 Spring Boot 内置了 Tomcat 启动,那它的原理你说的清楚吗?
- JavaScript 技巧篇-js增加延迟时间解决单击双击事件冲突,双击事件触发单击事件
- Python 技术篇-sha256()加密的使用方法,sha1、md5加密方法
- Python 技术篇-如何打印一段文字,用友云霸气控制台颜文字打印