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 进行开发