【问题标题】: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

标签: javascript


【解决方案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 方法的最佳实践建议,它是为数组分配新值的更好方法。

        【讨论】:

          猜你喜欢
          • 2018-03-12
          • 2011-03-12
          • 2020-11-28
          • 2017-09-08
          • 2011-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-05
          相关资源
          最近更新 更多