我知道这个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);
}
这些简短的指示确实给了我毛骨悚然。
谢谢。答案 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语句。