我想知道for循环中的第三个参数(statement / expression?)是否可以是有条件的。例如,如果使用可选的第三个参数调用函数,则此可选参数的存在与否将决定第三个操作。
function doThing(arg1, arg2, optional) {
var args = arguments;
for (var i = arg1; arg1 < arg2; args[2] ? i = i+optional : i++) {
// Do stuff
}
}
我无法在网上找到与此有关的任何内容,所以我猜测可能不会;如果不是什么是创建相同功能的最佳方式?
答案 0 :(得分:4)
你可以这样做:
var step = (optional === undefined ? 1 : optional);
for (var i = arg1; i < arg2; i += step) {
...
}
答案 1 :(得分:4)
根据http://www.ecma-international.org/ecma-262/5.1/#sec-12.6.3
IterationStatement : for ( ExpressionNoIn opt ; Expression opt ; Expression opt ) Statement
您可以看到for
的第三个参数是一个表达式。因此,任何有效表达式都可以在那里使用。
args[2] ? i = i+optional : i++
是一个有效的表达式。
我宁愿将其指定为:
i += args[2] ? optional : 1
答案 2 :(得分:2)
不,但你总是可以通过省略增量并在循环中手动处理它来重写for
循环:
for (var i = arg1; arg1 < arg2; ) {
// Do stuff
if (condition) {
i = i + optional;
} else {
i++;
}
}
但是,您的案例可以简化为:
for (var i = arg1; arg1 < arg2; i += (condition ? optional : 1))
如果逻辑比简单增量更复杂,那么使用第一个例子会更好。
答案 3 :(得分:1)
是的,你可以这样做,但它需要在每次迭代时重新评估args[2]
,这可能有点低效。我推荐一个略有不同的选择:
function doThing(arg1, arg2, optional) {
var inc = optional || 1;
for (var i = arg1; arg1 < arg2; i += inc ) {
// Do stuff
}
}
这样您只需要确定inc
值(循环中增加i
的数量)一次,然后您可以在整个函数的其余部分重用该值