是否可以在for循环中使用条件第三个表达式?

时间:2014-06-10 20:52:17

标签: javascript for-loop conditional

我想知道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
    }
}

我无法在网上找到与此有关的任何内容,所以我猜测可能不会;如果不是什么是创建相同功能的最佳方式?

4 个答案:

答案 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的数量)一次,然后您可以在整个函数的其余部分重用该值