42

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

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

不是push更合适吗?

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

6 回答 6

58

今年年初,我实际上问过自己同样的问题。更新了新的测试用例 http://jsperf.com/array-push-vs-unshift-vs-direct-assignment/2

看起来它push在 chrome 中要快得多,在 FF 中几乎相等。在 IE9 中直接也更快,但我很想看看它在 IE10 中的表现如何。

我想说大多数开发人员会假设设置数组的长度,然后使用直接赋值更快,就像大多数编程语言一样。但是 JavaScript 不同。Javascript 数组并不是真正的数组,它们只是键/值映射,就像所有其他 JavaScript 对象一样。所以预分配基本上是置若罔闻。

我个人更喜欢push(:

于 2013-03-27T00:47:42.153 回答
4

我相信这主要是习惯。

一些开发人员使用它只是因为这是他们习惯使用的方式,并且没有考虑过push这是一种替代方法。

一些开发人员曾经了解到一种方法比另一种方法要快得多,并且鉴于 Javascript 引擎最近的性能改进而没有对此进行审查。

我个人push经常使用。大多数时候,可读性和可维护性比性能更重要,至少在性能影响足够小的时候是这样。此处答案中发布的性能测试表明,各种方法之间的性能差异不是很大。

于 2013-03-27T01:15:35.383 回答
1

这是一种限制嵌套括号的方法。如果您有足够的数量,您将看不到有多少或需要多少(稍后查看代码时)。我会使用一个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/

于 2013-11-25T01:44:32.427 回答
1

我认为这与性能无关,或者至少没什么大不了的……这里真正重要的是声明性方式与命令性方式。

于 2017-07-13T23:49:40.807 回答
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];
}

就个人而言,我喜欢带有立即返回语句的函数。保持简单易看。喜欢这个问题。谢谢你问。

于 2015-07-31T17:40:12.417 回答
0

Array.prototype.push 方法返回更新后的数组的长度,而直接声明返回正在分配的值。这是我看到的唯一区别,但我通常会阅读一些关于 push 方法的最佳实践建议,它是为数组分配新值的更好方法。

于 2017-06-19T21:23:11.503 回答