我经常看到开发人员在JavaScript中使用如下表达式:
arr = []
arr[arr.length] = "Something"
arr[arr.length] = "Another thing"
push
不合适吗?
arr = []
arr.push("Something")
arr.push("Another thing")
答案 0 :(得分:51)
我实际上在今年年初问自己同样的问题。 更新了新的测试用例 http://jsperf.com/array-push-vs-unshift-vs-direct-assignment/2
似乎push
在铬方面要快得多,而在FF中大约相等。在IE9中,direct也更快,但我很想看看它在IE10中的表现如何。
我想说大多数开发人员会假设设置数组的长度,然后使用直接赋值更快,就像大多数编程语言一样。但JavaScript是不同的。 Javascript arrays aren't really arrays,它们就像所有其他JavaScript对象一样只是键/值映射。所以预先分配基本上是充耳不闻。
我个人更喜欢push
(:
答案 1 :(得分:4)
我相信这主要是习惯。
有些开发人员之所以使用它只是因为它是他们习惯的方式,并且没有考虑到push
可以替代它。
一些开发人员曾经一度学会了一种方法比另一种方法快得多,并且根据Javascript引擎最近的性能改进,我们没有对此进行评估。
我个人经常使用push
。大多数时候,可读性和可维护性比性能更重要,至少在性能影响足够小时。这里的答案中发布的性能测试表明,各种方法之间的性能差异并不大。
答案 2 :(得分:1)
这是一种限制嵌套braclets的方法。如果你有足够多的东西,你就无法看到你需要多么多或者多么熟悉(以后看代码时)。我会使用一个var,一个人应该只计算一次。
bar = foo.length;
foo[ bar++ ] = "new item 0";
foo[ bar++ ] = "new item 1";
foo[ bar++ ] = "new item 2";
foo[ bar++ ] = "new item 3";
答案 3 :(得分:1)
很多时候,当我将一个对象推入一个数组时,我希望将该对象的引用返回给我。例如:
// Returns object
function createAndAdd(arr) {
return arr[arr.length] = { id: 1 };
}
var obj = createAndAdd(arr);
现在我有了新对象和我已将它添加到数组中。如果我使用push,那么我将返回数组的长度。它看起来如下:
function createAndAdd(arr) {
var obj = { id: 1 };
arr.push(obj);
return obj;
}
甚至更丑,特别是如果对象变大:
function createAndAdd(arr) {
return arr[arr.push({ id: 1 }) -1];
}
就个人而言,我喜欢具有即时回复声明的功能。保持简单易用。喜欢这个问题。谢谢你提问。
答案 4 :(得分:0)
Array.prototype.push方法返回更新的数组长度,而直接声明返回正在分配的值。这是我看到的唯一区别,但我通常会阅读一些关于推送方法的最佳实践建议,这是将更新值分配给数组的更好方法。
答案 5 :(得分:-1)
我认为它不是关于性能,或者至少不是一个大问题......这里真正重要的是声明性方式与强制性方式。