有没有理由JavaScript开发人员不使用Array.push()?

时间:2013-03-27 00:24:46

标签: javascript

我经常看到开发人员在JavaScript中使用如下表达式:

arr = []
arr[arr.length] = "Something"
arr[arr.length] = "Another thing"

push不合适吗?

arr = []
arr.push("Something")
arr.push("Another thing")

6 个答案:

答案 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";

http://jsfiddle.net/vEUU3/

答案 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)

我认为它不是关于性能,或者至少不是一个大问题......这里真正重要的是声明性方式与强制性方式。