用法数组.推送方法
Usage Array.push method
请告诉我,将值推送到数组中的更快方法是什么?
我写了一个简单的测试来比较push
和a[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这么慢?也许存在一些更快的方法?
这两种方法完全相同,推送速度更快,因为相同的算法(获取数组长度)在脚本引擎内部工作,而不是在脚本中工作。 如果需要将该表达式的结果作为新值,则可以使用 ar[ar.length],例如在链式 assigment somevar = ar[ar.length] = "some new value"
我发现了一些其他可能的用途 - 与旧版本的javascript引擎兼容。在 JScript 版本 5.0 的Microsoft文档中,数组对象中没有提到推送方法。我实际上找到了我自己的代码,从当时(2000年左右)开始,它实际上使用了images[images.length] = s
代码。所以,也许数组并不总是有推送方法。
附言是的,MSDN 的推送方法表示需要版本 5.5,这在 Windows 2000 中甚至没有。
一些库(例如jQuery)使用ar[ar.length]
,因为它们不使用真正的数组,而是使用ArrayObjects,它没有.push
方法,因为它们是对象而不是数组。用于解决该问题并且您可能经常遇到的另一个技巧是
Array.prototype.push.call(arrObj,'newValue');
Panda-34提到了使用ar[ar.length]
的另一个原因:链式作业..!
相关文章:
- 数组在递归方法中设置为null
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 用于检查数组中是否存在元素的javascript自定义方法
- call()和apply()实际上是用来欺骗方法处理类似数组的对象的
- 从数组中删除元素的最佳方法是:javascript/jquery
- knex:根据结果创建数组的合适方法是什么
- 将数组从javascript格式化为php的更好方法,反之亦然
- 如何创建一个方法来验证数组的范围
- 使用filter和map方法将数组中某些元素的第一个字母大写-JavaScript
- 解析带有嵌入式数组的JSON对象,方法
- 查找对象数组是否包含其中一个标记的最快方法
- 如何用Typescript用自定义方法实现类数组
- 在 JavaScript 数组中的所有元素之间穿插元素的简洁方法
- 使用Underscore.js修改json数组中所选元素的更有效方法
- 选择具有值数组的所有元素的最有效方法
- JavaScript 中的范围(为什么在 $.post() 方法数组的作用域是本地的?)
- Javascript方法不填充方法(数组)
- Objects筛选方法数组中的THIS关键字