0

请告诉我,将值推入数组的更快方法是什么?

我写了一个简单的测试来比较pusha[a.length]=方法:

推.js:

self.onmessage = function (event) {
  var n = Number(event.data),
      i,
      pushAr = [],
      pushStart,
      pushDuration,
      ar = [],
      start,
      duration,
      message;

  // Push
  pushStart = new Date();
  for (i = 0; i < n; i += 1) {
    pushAr.push(i);
  }
  pushDuration = new Date() - pushStart;

  // explicit
  start = new Date();
  for (i = 0; i < n; i += 1) {
    ar[ar.length] = i;
  }
  duration = new Date() - start;

  message = "N = " + n;
  message += "\nPush duration: " + pushDuration + "; ";
  message += "Length duration: " + duration;

  self.postMessage(message);
};

主.js:

var worker = new Worker("push.js"),
    i;

worker.onmessage = function (event) {
  console.log(event.data);
};

for (i = 4; i < 8; i += 1) {
  worker.postMessage(Math.pow(10, i));
}

我得到了以下结果:

铬合金:

N = 10000
Push duration: 0; Length duration: 0
N = 100000
Push duration: 3; Length duration: 5
N = 1000000
Push duration: 56; Length duration: 90
N = 10000000
Push duration: 807; Length duration: 948

苹果浏览器:

N = 10000
Push duration: 1; Length duration: 4
N = 100000
Push duration: 2; Length duration: 2
N = 1000000
Push duration: 27; Length duration: 41
N = 10000000
Push duration: 283; Length duration: 461

火狐:

N = 10000
Push duration: 1; Length duration: 0
N = 100000
Push duration: 2; Length duration: 2
N = 1000000
Push duration: 11; Length duration: 20
N = 10000000
Push duration: 279; Length duration: 412

似乎Array.push更快,但为什么有些库会使用array length呢?这种方法有什么好处?为什么 Chrome 这么慢?也许存在一些更快的方法?

4

2 回答 2

2

两种方法完全相同,push 更快,因为相同的算法(获取数组长度)在脚本引擎内部而不是在脚本中工作。如果您需要将该表达式的结果作为新值,则可以使用 ar[ar.length],例如在链式分配中somevar = ar[ar.length] = "some new value"

我发现了一些其他可能的用途 - 与旧版本的 javascript 引擎的兼容性。在 JScript 5.0 版的 Microsoft 文档中,没有提到 Array 对象中的 push 方法。我实际上从那时(大约 2000 年)发现了自己的代码,它实际上使用了images[images.length] = s代码。所以,也许数组并不总是有 push 方法。

PS是的,推送方法的MSDN cocumentation说需要5.5版,甚至在Windows 2000中也不需要。

于 2012-06-06T08:52:26.483 回答
1

一些库(例如jQuery)使用ar[ar.length]是因为它们不使用真正的数组,而是使用ArrayObjects,.push因为它们是对象而不是数组,所以它们没有方法。用于解决该问题并且您可能经常遇到的另一个技巧是

Array.prototype.push.call(arrObj,'newValue');

ar[ar.length]Panda-34 提到了使用的另一个原因:链式分配..!

于 2012-06-06T09:00:21.000 回答