在for循环中是否可能有第三个条件表达式?

Is it possible to have a conditional third expression in a for loop?

本文关键字:三个 条件 表达式 循环 for 是否 可能有      更新时间:2023-09-26

我想知道for循环中的第三个参数(语句/表达式?)是否可以是有条件的。例如,如果要用第三个可选参数调用一个函数,则该可选参数的存在与否将决定第三个操作。

function doThing(arg1, arg2, optional) {
    var args = arguments;
    for (var i = arg1; arg1 < arg2; args[2] ? i = i+optional : i++) {
        // Do stuff
    }
}

我在网上找不到任何与此相关的东西,所以我猜可能没有;如果没有,那么创建相同功能的最佳方法是什么?

按照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

你可以这样做:

var step = (optional === undefined ? 1 : optional);
for (var i = arg1; i < arg2; i += step) {
    ...
}

不,但是您可以通过省略增量并在循环内手动处理它来重写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))

如果逻辑比简单增量更复杂,那么使用第一个示例会更好。

是的,您可以这样做,但这需要在每次迭代中重新评估args[2],这可能有点低效。我推荐一个稍微不同的替代方案:

function doThing(arg1, arg2, optional) {
    var inc = optional || 1;
    for (var i = arg1; arg1 < arg2; i += inc ) {
        // Do stuff
    }
}

这样,您只需要确定一次inc的值(在循环中i增加多少),然后您可以在函数的其余部分重用该值。