push方法将值追加到数组中,返回数组长度。
V8引擎中的Array.prototype.push()的源码
代码来自《Javascript设计模式与开发实践》:
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;
}
从源码可以得到一个信息:push是浅复制。
var arr = [{ a: 1 }];
var obj = { b: 2 };
arr.push(obj);
console.log(arr); // [{"a":1},{"b":2}]
现在我们改obj属性
obj.c = 3;
obj.b = 100;
console.log(obj); // {"b":100,"c":3}
console.log(arr); // [{"a":1},{"b":100,"c":3}]
像数组一样使用对象
push 是特意设计为通用的,我们可以使用它来获得便利。正如下面的例子所示,Array.prototype.push 可以在一个对象上工作。 注意,我们没有创建一个数组来存储对象的集合。 相反,我们将该集合存储在对象本身上,并使用在 Array.prototype.push 上使用的 call 来调用该方法,使其认为我们正在处理数组,而它只是像平常一样运作,这要感谢 JavaScript 允许我们建立任意的执行上下文。
var obj = {};
[].push.call(obj,"abcd");
console.log(obj); // {"0":"abcd","length":1}
写法上 [].push===Array.prototype.push 他俩一样
网友评论