function ArrayPush () { var n = TO_UNIT32(this.length); var m = %_ArgumentsLength(); for (var i = 0; i < m; i++) { // 逐个复制元素 this[i + n ] = %_Arguments(i); } this.length = n + m; // 修改数组的length return this.length; }
通过代码我们知道会先获取原数组长度 n, 然后开始从下标n循环赋值:this[i+n]。this.length重新赋值为原数组长度加新push参数的长度,所以就能理解 {2:1, 3:2,length:4}是怎么来的了。
解这道题需要去了解Array.prototype.push 在V8下如何实现的
这是V8的push实现代码:
function ArrayPush () {
var n = TO_UNIT32(this.length);
var m = %_ArgumentsLength();
for (var i = 0; i < m; i++) { // 逐个复制元素
this[i + n ] = %_Arguments(i);
}
this.length = n + m; // 修改数组的length
return this.length;
}
通过代码我们知道会先获取原数组长度 n, 然后开始从下标n循环赋值:this[i+n]。this.length重新赋值为原数组长度加新push参数的长度,所以就能理解 {2:1, 3:2,length:4}是怎么来的了。

empty x 2则是因为下标从2开始,0和1都是空的,和数组一样如图:
同时应该也能明白 push(...[])为什么能push多个的原理了
第 46 题:输出以下代码执行的结果并解释为什么?