我总是必须在没有任何东西的else条件中置null。有办法解决吗?

例如,

condition ? x = true : null;

基本上,有没有办法做到以下几点?

condition ? x = true;

现在它显示为语法错误。

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

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

当前回答

从技术上讲,它可以返回任何东西。 但是,我想说,对于一行,三元更容易输入,至少1个字符短,因此更快。

看起来吗?hasDriversLicense =真:0 if(看起来)hasDriversLicense =真

其他回答

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

然而,对于你的例子,你可以这样做:

if(condition) x = true;

不过,如果将来需要添加多个语句,使用大括号会更安全:

if(condition) { x = true; }

编辑:既然你提到了你的问题适用于的实际代码:

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

我们现在也有了“null coalescing operator”(??)。它的工作原理类似于“OR”操作符,但仅在左侧表达式为空或未定义时返回,对于其他假值则不返回。

例子:

const color = undefined ?? 'black';   // color: 'black'
const color = '' ?? 'black';   // color: ''
const color = '#ABABAB' ?? 'black';   // color: '#ABABAB'

你可以这样写

x = condition ? true : x;

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

这就等于

if (condition) x = true

编辑:

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

有几个选择——我不是说这些更好/更坏——只是选择

传入null作为第三个参数可以工作,因为现有值为空。如果您重构并更改条件,那么就会有这种情况不再成立的危险。在三元中传入现有值作为第二个选择可以防止这种情况:

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

更安全,但可能不那么好看,而且打字更多。实际上,我可能会写

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

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

这意味着几件事:

只有当在=的左边有一个变量将被分配返回值时,才使用三元表达式 当返回值是两个值之一时,只使用三元表达式(如果合适,则使用嵌套表达式) 表达式的每一部分(after ?和after:)应该返回一个没有副作用的值(表达式x = true返回true,因为所有表达式都返回最后一个值,但它也改变了x,而x对返回值没有任何影响)

简而言之,三元表达式的“正确”用法是

var resultofexpression = conditionasboolean ? truepart: falsepart;

而不是你的例子条件?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';