如果是真的......否则是速记

时间:2014-08-23 08:58:46

标签: javascript if-statement shorthand

我知道这个if语句的正常用例是例如。

var string = boolean ? "this" : "that";

我在编辑器中使用jhint,当我尝试类似

boolean ? array.push("this") : array.slice("that",1);

jshint throws(W030)“预期分配或函数调用,而是看到一个表达式”

到目前为止,代码总是很好但也许我很幸运。

所以我的问题是,为什么我不应该使用这种模式,什么是另类?因为写作

if(boolean){
    array.push("this");
} else {
    array.splice("that",1);
}

这些简短的指示确实给了我毛骨悚然。

谢谢。

5 个答案:

答案 0 :(得分:5)

可以将三元运算符包含在void operator内,如下所示:

void(cond ? expr1 : expr2);

这实现了期望的结果并传递了JSHint。请参阅JSFiddle并单击JSHint按钮。

但是,我建议使用以下语法:

if (cond) {
    expr1;
} else {
    expr2;
}

因为它更具可读性。仅仅因为JavaScript让你做出奇怪的事情并不意味着你应该这样做。

答案 1 :(得分:3)

你抱怨的是你盗用了conditional operator。它是一个操作员而不是一个控制结构。因此它存在于诸如+,-,*,/之类的东西中。这意味着您希望第一个操作数是布尔值,第二个和第三个操作数产生返回值。

整个事情是

的缩写
  if (boolean) {
   string ="this" ;
  } else {
   string ="that";
  }

它想要返回一个值(在您的情况下它不能),并且它希望您使用该值(您不会这样做)。所以,对于你的情况来说,tenary不是那么用的东西,因此它的可读性要差得多。

答案 2 :(得分:1)

您正在表达式中使用副作用来执行逻辑。

确实不是很友好的代码。它会起作用。

只需从表达式重写不同的逻辑。

答案 3 :(得分:1)

您可以使用以下方法绕过jshint消息:

void(boolean ? array.push("this") : array.slice("that",1));

答案 4 :(得分:1)

如果你真的想以干净的方式使用三元操作器进行这种操作,那么你可以这样做:

array[cond ? 'push' : 'slice'](cond ? "this" : "that", cond ? 1 : undefined);

array[cond ? 'push' : 'slice'].apply(null, cond ? ["this"] : ["that", 1]);

但无论如何,你可能更喜欢无聊的if语句。