Javascript三元运算符与||


17

我之前看过一些node.js代码,我发现编写它的人似乎更喜欢以下语法:

var fn = function (param) {
    var paramWithDefault = null == param ? 'Default Value' : param;
}

在我认为更为简洁的地方:

var fn = function (param) {
    var paramWithDefault = param || 'Default Value';
}

我想知道第二种形式是否实际上是更易为社会接受的JavaScript语法,为此,我比三元运算符更清楚地看到了第二种形式。

我注意到在第一个示例中,他使用的是双重等于(而不是三次等于),这意味着它将“未定义”计数为null,这将减少我能想到的影响。但是,我在很多地方都读过==在JavaScript中是一个非常邪恶的运算符(JIRCint非常反对它,IIRC)。


2
评论员:评论是为了寻求澄清,而不是为了扩展讨论。如果您有解决方案,请留下答案。如果您的解决方案已经发布,请对其进行投票。如果您想与其他人讨论这个问题,请使用chat。有关更多信息,请参见FAQ

Answers:


17

因为每次您输入0,“”,false或其他虚假值时,此代码都会评估为“默认值”。

function fn(param) {
  var paramWithDefault = param || 'Default Value';
  return paramWithDefault;
}

它可能不会对您如何使用此特定功能产生影响,但是如果您确实希望传递诸如空字符串,0或布尔值之类的东西,就可以避免这种糟糕的模式。


您只应在对象上使用null合并,如果定义了对象,则此方法将无效。空字符串可能例外。
Malfist 2011年

4
零比较是一个好主意,这可能是出乎意料的。
Ed James

1
+1-这个问题正是Python(最终)添加“ x if y else z”语法的原因。逻辑运算符的那些语义是相当普遍的,每当成语依靠它们来执行条件选择运算符的工作时,就会出现相同的常见错误。
Steve314 2011年

只是不要忘记将您的结构放在括号中,如果将它们与字符串串联一起使用var txt = 'Hello, ' + (user_name||'User') + '!';会起作用,但是如果没有括号,您将得到undefinedjsfiddle.net/4mFAB/1
2011年

7

您真正需要的是一个空合并运算符。但是,看到javascript并没有一个,程序员通常使用'||' 支持它。

但是,两者都是完全合理的。对于那些不了解什么是空合并运算符的人,可能更容易理解三元运算符。


另一个相关的运算符是将IIRC拼写为“ else”的Icon运算符。这样可以从第一个参数中识别出特殊的“失败”结果,并在这种情况下使用第二个参数作为替代。我有点希望Python使用两个单独的运算符-一个“ if”二进制断言运算符和一个类似Icon的“ else”运算符来实现“ x if y else z”,并且这两个运算符可以独立使用。但是,Icon不支持该样式,而是对相关运算符进行了奇怪的处理。
Steve314 2011年

@ Steve314:Python确实有您想要的东西:一个单独的else运算符[false-part, true-part]和一个单独的if运算符[..][bool(condition)]组合成[false-part, true-part][bool(condition)]。如果您想要懒惰的行为,则可以简单地lambda正确部分和错误部分。
Lie Ryan

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.