[英]Usage Array.push method
请告诉我,将值推入数组的更快方法是什么?
我编写了一个简单的测试来比较push
和a[a.length]=
方法:
push.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);
};
main.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这么慢? 也许存在一些更快的方法?
两种方法完全相同,推入速度更快,因为相同的算法(获取数组长度)在脚本引擎内部而不是脚本中起作用。 如果您需要将该表达式的结果作为新值,则可以使用ar [ar.length],例如在链式配置中somevar = ar[ar.length] = "some new value"
我发现了其他可能的用途-与旧版本的javascript引擎兼容。 在Microsoft文档的JScript 5.0版中,没有提到Array对象中的push方法。 我实际上从那时(大约2000年)开始发现了自己的代码,该代码实际使用images[images.length] = s
代码。 因此,也许数组并不总是具有push方法。
PS是的,用于推送方法的MSDN记录说需要5.5版 ,而Windows 2000甚至不需要。
一些库(例如jQuery)使用ar[ar.length]
是因为它们不使用实际数组,但是使用ArrayObjects,它们没有.push
方法,因为它们是对象而不是数组。 解决该问题并且您可能经常遇到的另一个技巧是
Array.prototype.push.call(arrObj,'newValue');
熊猫34提到了使用ar[ar.length]
的另一个原因:链式分配..!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.