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

我一直不得不在其他没有任何条件的情况下使用null 。 反正有吗? 例如

 condition ? x = true : null; 

基本上,有没有办法做到这一点:

 condition ? x = true; 

现在它显示为一个语法错误

仅供参考,下面是一些真实的示例代码:

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

首先,一个三元expression式不能代替一个if / else结构 – 它相当于一个返回值的if / else结构。 也就是说,if / else子句是代码,三元expression式是一个expression式 ,意味着它返回一个值。

这意味着几件事情:

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

总而言之 – 正确使用三元expression式是

 var resultofexpression = conditionasboolean ? truepart: falsepart; 

而不是你的榜样condition ? x=true : null ; condition ? x=true : null ; ,你使用三元expression式来设置x的值,你可以使用这个:

  condition && (x = true); 

这仍然是一个expression,因此可能无法通过validation,所以更好的方法是

  void(condition && x = true); 

最后一个将通过validation。

但是如果期望值是一个布尔值,那么只需要使用条件expression式本身的结果

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

更新关于您的示例,这可能更合适:

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

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

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

 if(condition) x = true; 

如果您以后需要添加多个声明,则使用大括号更安全:

 if(condition) { x = true; } 

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

 if(!defaults.slideshowWidth) { defaults.slideshowWidth = obj.find('img').width()+'px'; } 
 var x = condition || null; 

更多的时候,人们可以使用逻辑运算符来缩短语句语法:

 !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'值。

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

你可以写

 x = condition ? true : x; 

所以当条件是错误的时候x是没有修改的。

这相当于

 if (condition) x = true 

编辑:

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

有几个select – 我不是说这些更好/更糟 – 只是替代品

作为第三个参数传入null是因为现有值为null。 如果你重构并改变条件,那么存在这样的危险,这不再是真实的。 作为三元卫士的第二select传递出现的价值:

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

更安全,但也许不太好看,更多的打字。 在实践中,我可能会写

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

在你的情况下,我看到三元运算符是多余的。 您可以使用||,&&运算符将variables直接分配给expression式。

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

会变成 :

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

更清楚的是,它更像“javascript”风格。