Ras*_*spo 15 javascript performance for-loop
我有一个简单的FOR语句,如下所示:
var num = 10,
reverse = false;
for(i=0;i<num;i++){
console.log(i);
}
Run Code Online (Sandbox Code Playgroud)
当反向为假时,我希望它返回类似[0,1,2,3,5,5,7,8,9]的内容
但是,当反向为真时,它应该返回[9,8,7,6,5,4,3,2,1,0]
获取此结果的最有效方法是什么,如果在循环内反转为true或false ,则不检查每次?
我不想这样做:
var num = 10,
reverse = false;
for(i=0;i<num;i++){
if(reverse) console.log(num-i)
else console.log(i)
}
Run Code Online (Sandbox Code Playgroud)
我想在循环外只检查一次反向.
use*_*716 19
var num = 10,
reverse = false;
if(!reverse) for( var i=0;i<num;i++) log(i);
else while(num-- ) log(num);
// to avoid duplication if the code gets long
function log( num ) { console.log( num ); }
Run Code Online (Sandbox Code Playgroud)
编辑:
正如在下面的评论中指出,如果i是其他地方没有声明,你不打算为它是全球性的,那么你声明的其他变量声明.
如果您不想修改其值num,请将其分配给i第一个.
var num = 10,
reverse = false,
i;
if(!reverse) for(var i=0;i<num;i++) log(i); // Count up
else {var i=num; while(i--) log(i);} // Count down
function log( num ) { console.log( num ); }
Run Code Online (Sandbox Code Playgroud)
尝试使用2个循环:
if (reverse) {
for(i=num-1;i>=0;i--){
console.log(i)
}
}
else {
for(i=0;i<num;i++){
console.log(i)
}
}
Run Code Online (Sandbox Code Playgroud)
var num = 10,
reverse = false;
for (var i = 0, n = reverse?num-1:0, d = reverse?-1:1; i < num; i++, n+=d) {
console.log(n);
}
Run Code Online (Sandbox Code Playgroud)
这相当于以下内容,它更易读,但不太紧凑:
var num = 10,
reverse = false;
var start = reverse ? num-1 : 0,
end = reverse ? -1 : num,
step = reverse ? -1 : 1;
for (var i = start; i != end; i += step) {
console.log(i);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
实际上,这两个解决方案并不相同,因为第一个解决方案有一个额外的增量操作.不过,从性能的角度来看,它可以忽略不计.如果您真的想要获得性能最佳的紧凑型解决方案,您可以执行以下操作(不适合胆小的人):
var num = 10,
reverse = false;
for (var r=reverse, i=r?num-1:0, n=r?-1:num, d=r?-1:1; i!=n; i+=d) {
console.log(i);
}
Run Code Online (Sandbox Code Playgroud)
这具有以下优点:具有单个控制结构,每个循环中的单个测试以及单个迭代器添加.它没有迭代器递增/递减那么快,但只是略微如此.