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”风格。