【问题标题】:Is it possible to have a conditional third expression in a for loop?是否可以在 for 循环中有条件的第三个表达式?
【发布时间】:2014-07-31 18:49:20
【问题描述】:

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

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

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

【问题讨论】:

  • 您的optional 变量是否确定增加i 的步数?
  • @showdev - 在这个例子中是的,抱歉没有说清楚。但我想不一定非得如此。
  • 为什么使用命名参数和args[2]的混合语法?为什么不只使用其中一个?
  • @TedHopp 只是因为我读到arguments 并不总是表现得像一个数组,而将它们存储在一个数组中并对其进行操作会产生更可靠的结果。但你可能会把它归结为缺乏经验。

标签: javascript for-loop conditional


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • @verism 是的,抱歉。那是一个错字。
    【解决方案3】:

    你可以这样做:

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

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 鉴于许多有用的建议,很难选择一个答案,但我接受它,因为它直接解决了问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 2020-09-21
      相关资源
      最近更新 更多