JavaScript中的三元运算符,不带“quot;否则";

JavaScript中的三元运算符,不带“quot;否则";,javascript,optimization,syntax-error,Javascript,Optimization,Syntax Error,我总是必须将null放在没有任何内容的else条件中。有办法绕过它吗 比如说, condition ? x = true : null; 基本上,有没有办法做到以下几点 condition ? x = true; 现在它显示为一个语法错误 仅供参考,以下是一些实际示例代码: !defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null; 不,它需要三个操作数。这就是为什么它们

我总是必须将
null
放在没有任何内容的else条件中。有办法绕过它吗

比如说,

condition ? x = true : null;
基本上,有没有办法做到以下几点

condition ? x = true;
现在它显示为一个语法错误

仅供参考,以下是一些实际示例代码:

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

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

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null ;
但是,对于您的示例,您可以这样做:

if(condition) x = true;
尽管如果将来需要添加多个语句,使用大括号会更安全:

if(condition) { x = true; }
编辑:既然您提到了您的问题适用于的实际代码:

if(!defaults.slideshowWidth)
    { defaults.slideshowWidth = obj.find('img').width()+'px'; }
你可以写

x = condition ? true : x;
因此,当条件为false时,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'

首先,三元表达式不是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';

在你的例子中,我认为三元运算符是多余的。可以使用| |,&&运算符将变量直接指定给表达式

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

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

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

人们更多地使用逻辑运算符来缩短语句语法:

!defaults.slideshowWidth &&
  (defaults.slideshowWidth = obj.find('img').width() + 'px');
但在您的特定情况下,语法可能更简单:

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width() + 'px';
如果将
默认值.slideshowWidth
计算为true,则此代码将返回
默认值.slideshowWidth
值,否则返回
obj.find('img').width()+'px'

有关详细信息,请参阅逻辑运算符列表。

简单地说

    if (condition) { code if condition = true };

要在数组或对象声明中使用三元运算符而不使用其他运算符,可以使用扩展运算符,
…()

对于对象:

const cond = false;
const obj = {
  ...(cond ? {a: 1} : {}),
  b: 2,
};
    // {b: 2}

你可以,但不应该。至少不是没有花括号,它很容易出错,是真的吗?我明白需要卷发的主要原因是因为它们使jslint的生活更轻松,所以从重构的角度来看,它很容易出错。在真实情况下,你会回来做更多的事情,而没有意识到那里没有花括号。新代码将始终执行,而不是when true的情况。不,我知道,我只是喜欢编写没有附加条件的条件语句,例如if(){}else{},当它等于简单?:;老实说,我从未见过比Javascript更害怕使用语言的开发人员:-P我不希望有人告诉我不应该使用大括号。我经常省略它们,而且从来没有遇到过比意外丢失一个大括号更大的麻烦。使用像
这样的三元条件?x=true:null
可能应该写成
x=(条件?true:null)。另外,在javascript中,
null
的计算结果为false,因此在本例中,您可以
x=(条件)并获得相同的结果。马特,你的答案是最好的,但这不是答案,而是评论!马特,我的实际代码是:!默认值。幻灯片宽度?defaults.slideshowWidth=obj.find('img').width()+'px':null;一种更短更好的编写方法?defaults.slideshowWidth=defaults.slideshowWidth | | | obj.find('img').width()+'px';最好避免标识分配,因此这应该只是一个条件:
if(!defaults.slideshowWidth)defaults.slideshowWidth=obj.find('img').width()+'px'
一些实时代码是(无论如何要去掉其中的null?)!默认值。幻灯片宽度?defaults.slideshowWidth=obj.find('img').width()+'px':null
(defaults.slideshowWidth)| |(defaults.slideshowWidth=obj.find('img').width()+'px')
defaults.slideshowWidth=defaults.slideshowWidth | |(obj.find('img').width()+'px')
>如果可以转换为true,则返回expr1;否则,返回expr2。因此,不允许编辑来更正
i/else
输入错误,因为它没有足够的字符。void(condition&&x=true)-这看起来很好,但似乎抛出了“无效赋值左侧”错误。然而,这并不直观,尤其是对于不习惯这种样式的开发人员。您可以像这样简单易懂地编写:if(condition){x=true;}您可以详细说明为什么是条件
const cond = false;
const obj = {
  ...(cond ? {a: 1} : {}),
  b: 2,
};
    // {b: 2}