arr.push(Math.random());
and
arr[arr.length]=Math.random();
拥有相同的结果。
那么,它们之间有什么区别呢?换句话说,什么时候使用前者比后者更好?
arr.push(Math.random());
and
arr[arr.length]=Math.random();
拥有相同的结果。
那么,它们之间有什么区别呢?换句话说,什么时候使用前者比后者更好?
它们之间有什么区别?
看着这个规范并思考一下,至少有六个区别:
push(...)
是一个方法调用,而另一个是一个赋值操作。push
添加多个元素:arr.push(one, two, three)
。要使用赋值完成这个操作,需要多次赋值。(push
直到所有操作完成后才更新 length
,而多次赋值会为每次赋值更新它。)push
检查数组的长度是否会变成 > 253-1,如果是,则抛出一个 TypeError
;而赋值则不会,它只是愉快地创建了一个名称不是数组索引的属性。(这是一个有趣的检查,因为数组索引只允许最大为 232-1。但是规范在很多关于数组长度的地方都做了这个检查。)arr.push(...)
在 arr
上查找 push
,因此它可以被拦截(通过将新的 push
赋值给 arr
或 Array.prototype
)。赋值只能以每个属性为基础进行拦截(使用 setter 来设置 "0"
、"1"
等),或通过 Proxy
进行拦截。set
陷阱的数组的代理,而不是直接使用数组,你可能会观察到不同的 set
调用(因为 set
陷阱可能会直接在底层数组上设置值,因此你看不到针对 length
的 set
)。arr.push(value)
的结果是数组的新长度;而 arr[arr.lenght] = value
的结果是被推入的值。const a = [];
const p = new Proxy(a, {
set(target, prop, value) {
console.log("Proxy set called for " + prop + " = " + value);
target[prop] = value;
return true;
}
});
p[0] = "a"; // We don't see length set here
console.log(p[0]);
p.push("b"); // We do here, because `push` sets `length` through
// the proxy reference
console.log(p[1]);
arr.push(item)
返回数组的新长度。arr[arr.length] = item
返回已推送的项目。arr.concat(item)
返回带有推送项目的新数组。(arr.push(item),arr)
返回包含新推送项目的数组。
arr.push()
是更常见的习惯用语,也更短。 - Barmararray
在测试迭代之间被重复使用,因此push
比赋值做了更多的工作。这里有一个真正比较相似并确保死代码优化不会启动的测试:https://jsperf.com/simple-array-append-comparison - T.J. Crowder