JavaScript中的三元运算符没有“Else”

时间:2010-05-28 21:50:58

标签: javascript optimization syntax-error

我总是把null放在没有任何东西的其他条件下。不管怎么说呢? E.g。

condition ? x = true : null;
基本上,有没有办法:

condition ? x = true;

现在它显示为语法错误

仅供参考,这里有一些真实的示例代码:

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;

8 个答案:

答案 0 :(得分:184)

首先,三元表达式不是if / else构造的替代 - 它等同于返回值的if / else构造。也就是说,if / else子句是代码,三元表达式是表达式,这意味着它返回一个值。

这意味着几件事:

  • 仅当=左侧有一个要赋予返回值的变量时才使用三元表达式
  • 仅当返回的值是两个值之一时才使用三元表达式(或者如果适合则使用嵌套表达式)
  • 表达式的每个部分(在?之后?之后)应该返回一个没有副作用的值(表达式x = true返回true,因为所有表达式都返回最后一个值,但是也会更改x而不对x产生任何影响返回的值)

简而言之 - 三元表达的“正确”使用是

var resultofexpression = conditionasboolean ? truepart: falsepart;

您使用三元表达式来设置condition ? x=true : null ;的值,而不是您的示例x,您可以使用此代码:

 condition && (x = true);

这仍然是一个表达式,因此可能无法通过验证,因此更好的方法是

 void(condition && x = true);

最后一个将通过验证。

但话说回来,如果期望值是布尔值,只需使用条件表达式本身的结果

var x = (condition); // var x = (foo == "bar");

<强>更新 关于你的样本,这可能更合适:

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

答案 1 :(得分:17)

不,它需要三个操作数。这就是为什么他们被称为三元运算符。

但是,对于你的例子,你可以这样做:

if(condition) x = true;

如果你需要在将来添加多个语句,那么使用大括号会更安全:

if(condition) { x = true; }

修改:现在您提到了您的问题适用的实际代码:

if(!defaults.slideshowWidth)
    { defaults.slideshowWidth = obj.find('img').width()+'px'; }

答案 2 :(得分:11)

var x = condition || null;

答案 3 :(得分:7)

人们更常使用逻辑运算符来缩短语句语法:

!defaults.slideshowWidth &&
  (defaults.slideshowWidth = obj.find('img').width()+'px');

但在您的特定情况下,语法可以更简单

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

如果defaults.slideshowWidth评估为true,则此代码将返回defaults.slideshowWidth值,否则返回obj.find('img').width()+'px'值。

有关详细信息,请参阅逻辑运算符的Short-Circuit Evaluation

答案 4 :(得分:4)

你可以写

x = condition ? true : x;

当条件为假时,x未被修改。

这相当于

if (condition) x = true

编辑:

!defaults.slideshowWidth 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : null 

有几种选择 - 我不是说这些更好/更差 - 仅仅是替代品

传入null作为第三个参数,因为现有值为null。如果你重构并改变条件,那么就存在这种情况不再存在的危险。传递价值作为三元防御中的第二选择:

!defaults.slideshowWidth = 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : defaults.slideshowwidth 

更安全,但也许不那么好看,而且打字更多。在实践中,我可能会写

defaults.slideshowWidth = defaults.slideshowWidth 
               || obj.find('img').width()+'px'

答案 5 :(得分:2)

在您的情况下,我认为三元运算符是冗余的。您可以使用||,&amp;&amp ;;将变量直接分配给表达式。运算符。

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null ;

将成为:

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

它更清楚,它更多&#34; javascript&#34;风格。

答案 6 :(得分:1)

要在数组或对象声明中使用不带 else 的三元运算符,可以使用ES6扩展运算符...()

const cond = false;
const arr = [
  ...(cond ? ['a'] : []),
  'b',
];
    // ['b']

对于对象:

const cond = false;
const obj = {
  ...(cond ? {a: 1} : {}),
  b: 2,
};
    // {b: 2}

Original source

答案 7 :(得分:-1)

简单

    if (condition) { code if condition = true };