我总是把null
放在没有任何东西的其他条件下。不管怎么说呢? E.g。
condition ? x = true : null;
基本上,有没有办法:
condition ? x = true;
现在它显示为语法错误
仅供参考,这里有一些真实的示例代码:
!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;
答案 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}
答案 7 :(得分:-1)
简单
if (condition) { code if condition = true };