JavaScript 开发人员不使用 Array.push() 是不是有原因?

Posted

技术标签:

【中文标题】JavaScript 开发人员不使用 Array.push() 是不是有原因?【英文标题】:Is there a reason JavaScript developers don't use Array.push()?JavaScript 开发人员不使用 Array.push() 是否有原因? 【发布时间】:2013-03-17 00:08:13 【问题描述】:

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

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

push 不是更合适吗?

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

【问题讨论】:

我意识到我只是一个业余爱好者,但我确实使用push(),现在我觉得我错过了一些迄今为止秘密使用的禁忌症。 . 我经常使用它,虽然我更喜欢一个更符合逻辑的索引器(如for 循环)。 人们有时确实认为它更快。请参阅 Why is array.push sometimes faster than array[n] = value? 和 Using the push method or .length when adding to array? - 结果差异很大,以至于实际上无关紧要。使用更易于理解的内容。 更快的是为索引增加一个变量,而不是每次迭代都使用 push 或读取不断增长的 array.length。并不是说这种差异是人类可以测量的。 关于这个基准,在 Chrome 中推送更快:jsben.ch/#/rGPv3 【参考方案1】:

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

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

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

我个人更喜欢push (:

【讨论】:

我的假设也是性能。在某一时刻,避免push() 肯定会更快。不过当然不会了! +1 在较新版本的 Chrome 中,直接分配变得相当快。直接赋值(即使使用 .length)现在几乎是使用 push 的两倍。 没有。 Javascript在这里并没有什么不同。设置数组的长度并使用直接赋值 is 实际上更快(Safari 和 Chrome):jsperf.com/push-method-vs-setting-via-key/10 这可能是因为 javascript 运行时通常是用 C 实现的,并且基于一些启发式。请参阅此处的第 1 点和第 2 点:quora.com/How-are-javascript-arrays-implemented-internally/…【参考方案2】:

我相信这主要是习惯。

一些开发人员使用它只是因为这是他们习惯使用的方式,并没有考虑到push 会是一个替代方案。

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

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

【讨论】:

+1,绝对是。而且不仅性能差异很小,而且每个测试用例和浏览器版本之间都会发生变化:-)【参考方案3】:

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

【讨论】:

【参考方案4】:

当我将一个对象推入一个数组时,我经常希望将对该对象的引用返回给我。例如:

// 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];

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于JavaScript 开发人员不使用 Array.push() 是不是有原因?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 新提案:array.groupBy()

厉害了,JavaScript 新提案:array.groupBy()

你可能不需要 jQuery!使用原生 JavaScript 进行开发

使用EHttpClient Yii的出站efax开发人员api请求不起作用

开发人员工具中的禁用缓存选项不起作用

性能up!面向前端开发人员的14个JavaScript代码优化技巧