在JavaScript中执行循环的最佳方式是什么
What is the best way to do loops in JavaScript
我偶然发现了几种在JavaScript中循环的方法,我最喜欢的是:
for(var i = 0; i < a.length; i++){
var element = a[i];
}
但正如这里测试的那样(http://www.robertnyman.com/2008/04/11/javascript-loop-performance/),可能应该这样写,使得长度只计算一次。
在jQuery中有一个.每个都可以粘贴一个函数。我更喜欢这个,因为我不必像上面的解决方案那样键入两次数组。
如果JavaScript支持宏,那么你自己动手就轻而易举了,但遗憾的是,它没有。
你们用什么?
我已经开始在相关的地方使用迭代器。性能是合理的,但更重要的是,它允许您封装循环逻辑:
function createIterator(x) {
var i = 0;
return function(){
return x[i++];
};
}
然后使用:
var iterator=createIterator(['a','b','c','d','e','f','g']);
iterator();
返回"a";
iterator();
返回"b";
等等
迭代整个列表并显示每个项目:
无功电流;while(current=迭代器()){console.log(当前);}
请注意,以上内容仅适用于迭代包含"非虚假"值的列表。如果此数组包含以下任一项:
- 0
- 虚假的
- "
- null
- NaN
上一个循环将停止在该项,而不总是您想要/期望的。
为了避免这种使用:
var current;
while((current=iterator())!==undefined)
{
console.log(current);
}
对原来的小改进,只计算一次数组大小:
for(var i = 0, len = a.length; i < len; i++){ var element = a[i]; }
此外,我看到了很多。。在循环中。尽管要记住,它在技术上不是犹太洁食的,并且会导致原型的问题,特别是:
for (i in a) { var element = a[i]; }
只需先将长度存储在变量中。
var len = a.length;
for (var i = 0; i < len; i++) {
var element = a[i];
}
我知道我迟到了,但我对不依赖顺序的循环使用反向循环。
与@先生非常相似。Muskrat的-但简化了测试:
var i = a.length, element = null;
while (i--) {
element = a[i];
}
您可以始终使用while循环,并提前计算数组限制。
Var max = a.length-1;
var i = 0;
while(i <= max)
{
var element = a[i];
i++;
}
如果数组中有很多元素,并且速度是个问题,那么您希望使用从最高到最低迭代的while循环。
var i = a.length;
while( --i >= 0 ) {
var element = a[i];
// do stuff with element
}
我自己不使用它,但我的一位同事使用了这种风格:
var myArray = [1,2,3,4];
for (var i = 0, item; item = myArray[i]; ++i) {
alert(item);
}
就像Ash的回答一样,如果你的数组中有"false"值,这会遇到问题。为了避免该问题,请将其更改为(item = myArray[i]) != undefined
我不知道使用标准for(;;)循环有什么问题。一个小小的测试
var x;
var a = [];
// filling array
var t0 = new Date().getTime();
for( var i = 0; i < 100000; i++ ) {
a[i] = Math.floor( Math.random()*100000 );
}
// normal loop
var t1 = new Date().getTime();
for( var i = 0; i < 100000; i++ ) {
x = a[i];
}
// using length
var t2 = new Date().getTime();
for( var i = 0; i < a.length; i++ ) {
x = a[i];
}
// storing length (pollution - we now have a global l as well as an i )
var t3 = new Date().getTime();
for( var i = 0, l = a.length; i < l; i++ ) {
x = a[i];
}
// for in
var t4 = new Date().getTime();
for( var i in a ) {
x = a[i];
}
// checked for in
var t5 = new Date().getTime();
for( var i in a ) {
if (a.hasOwnProperty(i)) {
x = a[i];
}
}
var t6 = new Date().getTime();
var msg = 'filling array: '+(t1-t0)+'ms'n'+
'normal loop: '+(t2-t1)+'ms'n'+
'using length: '+(t3-t2)+'ms'n'+
'storing length: '+(t4-t3)+'ms'n'+
'for in: '+(t5-t4)+'ms'n'+
'checked for in: '+(t6-t5)+'ms';
console.log( msg );
结果在:
filling array: 227ms
normal loop: 21ms
using length: 26ms
storing length: 24ms
for in: 154ms
checked for in: 176ms
所以:-因为in是最长的,所以使用length属性(这是一个属性,不需要计算)几乎和首先存储它一样快-这只比使用整数慢一点点。
AND a for()是在数组上循环的常用方法,这是每个人都期望和理解的
所有这些都向运行的作用域-i中添加了一个变量,这是此用途的通用名称,因此不应用于其他用途。首先存储长度会将另一个var-l-添加到作用域中,这是不必要的
因此,首先确定完美的javascript循环,我认为它应该是这样的:
ary.each(function(){$arguments[0]).remove();})
这可能需要prototype.js库。
接下来,您会对arguments[0]部分感到厌恶,并让代码从服务器框架中自动生成。只有当梯子在海边时,这才有效。
现在,您已经通过以下方式生成了上述内容:
ary do:[:each|each element remove]。
这与语法完成一起完成,并准确地翻译为上面的javascript。当人们阅读你的代码时,这会让以前从未使用过seaside原型集成的人大吃一惊。它确实也让你感觉很酷。更不用说你在这里能获得的极客感了。女孩们喜欢它!
- 在localhost Dev Box上测试JSONP请求的最佳方式
- 为react组件传递道具的最佳方式
- 让Webpack管理Quirky AMD定义的最佳方式
- 在承诺链中处理早期回报的最佳方式
- 在ng重复循环中显示条件内容的最佳方式是什么
- 在phonegap中为android调用onload函数的最佳方式
- 链接两个网页或网络应用程序的最佳方式
- 什么's是连接供应商js文件的最佳方式
- 什么's是在javascript中迭代项的最佳方式
- 在node.js中编写单元测试的最佳方式是什么
- 在页面上记录数据并实现pushstate()的最佳方式
- 使用AJAX在Rails中提交动态表单的最佳方式是什么
- 什么'这是加载jQuery的最佳方式
- 将大数组(字符串和类型数组的混合物)存储到blob或文件中/从blob或文件检索大数组的最佳方式
- 在网站上显示.mov作为加载屏幕的最佳方式
- 使用Angular存储用户以前是否选中过复选框,然后再调用它的最佳方式是什么
- 以角度渲染表中数据的最佳方式
- 删除集合中旧邮件/帖子的最佳方式
- 显示全屏Ajax加载程序的最佳方式
- PHP和JS中表单验证的最佳方式