JavaScript中的三元运算符没有"Else"

Osc*_*son 125 javascript optimization syntax-error

我总是不得不放入null没有任何东西的其他条件.不管怎么说呢?例如

condition ? x = true : null;
Run Code Online (Sandbox Code Playgroud)

基本上,有办法吗?

condition ? x = true;
Run Code Online (Sandbox Code Playgroud)

现在它显示为语法错误

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

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;
Run Code Online (Sandbox Code Playgroud)

Sea*_*sey 201

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

这意味着几件事:

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

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

var resultofexpression = conditionasboolean ? truepart: falsepart;
Run Code Online (Sandbox Code Playgroud)

您可以使用以下代码condition ? x=true : null ;来代替您使用三元表达式设置值的示例x:

 condition && (x = true);
Run Code Online (Sandbox Code Playgroud)

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

 void(condition && x = true);
Run Code Online (Sandbox Code Playgroud)

最后一个将通过验证.

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

var x = (condition); // var x = (foo == "bar");
Run Code Online (Sandbox Code Playgroud)

更新 关于您的样本,这可能更合适:

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';
Run Code Online (Sandbox Code Playgroud)

  • 辉煌的SO,不允许编辑纠正`i/else`错字,因为它不够用于字符. (4认同)
  • 但是,这并不直观,特别是对于不习惯这种风格的开发人员而言.您可以像以下一样容易且更可读地编写:if(condition){x = true; } (4认同)
  • 您能否详细说明 * 为什么 * 只有在将结果值分配给您的变量时才应使用条件三元运算符?我指的是你的清单中的第一点。意图是可以理解的,但是我想知道在返回值未使用时是否有特定的原因不使用三元运算符,例如性能,安全性或其他什么。 (3认同)
  • 我用它来做`(!something && doSomething());`,谢谢. (2认同)
  • 您能否解释“可能不通过验证”是什么意思?我不明白为什么要把表达式包装在`void()`中。谢谢。 (2认同)

In *_*ico 18

不,它需要三个操作数.这就是为什么他们被称为三元运营商.

但是,对于您的示例,您可以这样做:

if(condition) x = true;
Run Code Online (Sandbox Code Playgroud)

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

if(condition) { x = true; }
Run Code Online (Sandbox Code Playgroud)

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

if(!defaults.slideshowWidth)
    { defaults.slideshowWidth = obj.find('img').width()+'px'; }
Run Code Online (Sandbox Code Playgroud)

  • 老实说,我从来不知道开发人员比Javascript更害怕使用语言:-PI不会喜欢有人告诉我不应该使用花括号.我省略了很多,从来没有比我不小心错过支架更麻烦. (3认同)

小智 12

我们现在还有“空合并运算符”(??)。它的工作原理与“OR”运算符类似,但仅在左侧表达式为 null 或未定义时返回它,对于其他虚假值则不会返回它。

例子:

const color = undefined ?? 'black';   // color: 'black'
const color = '' ?? 'black';   // color: ''
const color = '#ABABAB' ?? 'black';   // color: '#ABABAB'
Run Code Online (Sandbox Code Playgroud)


phi*_*reo 11

var x = condition || null;
Run Code Online (Sandbox Code Playgroud)

  • `(defaults.slideshowWidth)|| (defaults.slideshowWidth = obj.find('img').width()+'px')`或`defaults.slideshowWidth = defaults.slideshowWidth || (obj.find( 'IMG').宽度()+ '像素')` (2认同)

Eug*_*rin 9

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

!defaults.slideshowWidth &&
  (defaults.slideshowWidth = obj.find('img').width()+'px');
Run Code Online (Sandbox Code Playgroud)

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

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';
Run Code Online (Sandbox Code Playgroud)

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

有关详细信息,请参阅逻辑运算符的短路评估.


mdm*_*dma 5

你可以写

x = condition ? true : x;
Run Code Online (Sandbox Code Playgroud)

因此,当条件为false时,x不会被修改。

这相当于

if (condition) x = true
Run Code Online (Sandbox Code Playgroud)

编辑:

!defaults.slideshowWidth 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : null 
Run Code Online (Sandbox Code Playgroud)

有几种选择-我并不是说这些更好/更糟-只是选择

将null作为第三个参数传递是可行的,因为现有值是null。如果您重构并更改条件,则有可能不再存在这种危险。在三元组中,将存在值作为第二选择传递,以防此:

!defaults.slideshowWidth = 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : defaults.slideshowwidth 
Run Code Online (Sandbox Code Playgroud)

更安全,但可能看起来不太好,而且打字更多。在实践中,我可能会写

defaults.slideshowWidth = defaults.slideshowWidth 
               || obj.find('img').width()+'px'
Run Code Online (Sandbox Code Playgroud)