【问题标题】:Javascript: if(arg1, arg2, arg3...) statementJavascript: if(arg1, arg2, arg3...) 语句
【发布时间】:2011-08-25 20:37:32
【问题描述】:

刚刚发现if 语句在javascript中可以有多个参数:

// Webkit
if (true, true, false) console.log("this won't get logged");

它的支持程度如何?

附言我知道这类似于使用&&,但这很有趣,google 无法提供答案。

【问题讨论】:

  • 在生产代码中使用这种语法是 7 个致命的编程罪之一。
  • 你能提供你在哪里找到的来源吗?不是我不相信你,但这看起来很有趣。
  • 本质上这仅在代码化的 JavaScript 中有用

标签: javascript


【解决方案1】:

If 语句不能有“多个参数”。你观察到的是comma operator的使用。

逗号运算符计算它的两个操作数(从左到右) 并返回第二个操作数的值。

现在我们明白为什么(true, true, false) 不记录任何内容而(true, false, true) 会。附带说明一下,这种语法得到普遍支持(但几乎不应该使用)。

【讨论】:

  • 等等!那么为什么它只需要返回第二个操作数呢?
  • @gAMBOOKa:在示例中,根本没有。当左表达式有副作用时,正是针对那些。
  • 恐怕我没有完全理解。 “有副作用”是什么意思?
  • @gAMBOOKa, destroy_the_world(), true 将评估为true,但也会毁灭世界。
  • i = 10, i === 10 计算结果为真,因为左侧具有将数字 10 分配给 i 的副作用。 i === 0, i = 10 的计算结果为 10,与只写 i = 10 相同,因为左侧没有副作用。
【解决方案2】:

这不是if 语句的特性,而是, 运算符。

你可以用逗号分隔表达式,每个表达式都会被计算,但只有最后一个被用作整个表达式的值。

在您的示例中,它非常无用,但有时您希望表达式评估它的副作用。示例:

var i = 1;
if (i += 2, i == 3) console.log("this will get logged");

【讨论】:

  • 哦,我希望我能在编辑后再次投票,哈哈,很好的例子
  • 为什么不能像 for() 一样在 if() 中使用 var? (我知道这与您的具体示例无关,只是想知道?)
  • @w3d:这是for 语句的第一个表达式中的一个特殊功能,因为您经常需要循环变量。
【解决方案3】:

它与&& 不同(尝试将false 移动到第一位或第二位),它与if 无关,并且它与函数文字一样受到支持,即绝对普遍。您遇到的是从 C 继承的逗号运算符,它从左到右评估表达式(实际上,它始终是两个表达式,并且从概念上讲会导致像 a + b + c 那样的嵌套)并丢弃除最后一个结果之外的所有内容。最后一个结果成为整个表达式的结果。

【讨论】:

    【解决方案4】:

    在 IE7 中工作,所以我想这得到了很好的支持。

    【讨论】:

    • 依赖IE评估标准?
    • 不——它的 LCD(最小公分母)测试。如果有任何功能可能会破坏,它可能是 IE 6 或 7! :D
    • 大约 50% 的时间如果某些东西在 IE 中有效,它在其他任何地方都不会有效哈哈:P,他们喜欢以自己的方式做事。显然,逗号运算符适用于所有浏览器。它是 Javascript 1.0 的一部分,如果我没记错的话,它一直是 ECMAScript 的一部分。
    • @Paul:是的(但在 CSS/HTML 的情况下大部分都是这样)。同样在这种情况下,WebKit 已经过验证。而且我已经停止使用 FF... ;)
    • @Mrchief 恐怕 LCD 参数不适用于 IE。通常情况下,如果某些东西在 IE 7 中有效,那是偶然而不是设计。
    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多