18

可以使用像这样的语句这样的条件运算符吗?

(x == y) ? alert("yo!") : alert("meh!");

或者使用它来分配这样的值是否更正确?

z = (x == y) ? "yo!" : "meh!";

如果像语句一样使用它并没有错,那么是否可以像这样添加多行代码来执行?对多行代码使用 ifthen 和 switch 语句是否更正确?

(x == y) ? (alert("yo!"), document.write("woot!")) : (alert("meh!"), document.write("blah!"));
4

5 回答 5

25

条件运算符有意简洁,对赋值特别有用:

var a = x ? 1 : 2;

使用它们来有条件地运行函数,虽然可能,但为了便于阅读,应该使用 IF/ELSE 语句来完成:

// This is possible but IMO not best practice:
X ? doSomething() : doSomethingElse();

虽然冗长,但大多数时候,这是更好的解决方案:

if (X) {
    doSomething();
} else {
    doSomethingElse();
}

IF/ELSE 结构的一个显着好处是,您可以在每种情况下轻松添加额外的任务。

您的最后一个片段也是可能的,但它看起来有些冗长,并且可能更适合更传统的逻辑结构;就像一个 IF/ELSE 块。

也就是说,条件运算符仍然是可读的,例如

(something && somethingElse > 2) ?
   doSomeLongFunctionName()
   : doSomeOtherLongFunctionName();

最后,像许多事情一样,这取决于个人喜好。永远记住,你编写的代码不只是为你而写的;其他开发人员将来可能不得不涉足它;尝试使其尽可能可读。

于 2009-05-15T17:13:37.223 回答
4

JavaScript 不会阻止你这样做,但这是一种非常不寻常的做法,它会让任何阅读你代码的人感到困惑。

条件运算符几乎总是用于选择两个替代值,而不是语句。if语句优先用于语句的条件分支。

至于你的最后一个问题,是的,如果你真的必须,你可以滥用这个[]结构:

(x == y) ? [alert("yo!"), document.write("woot!")] : otherstuff();

但请不要。8-)

于 2009-05-15T17:09:27.527 回答
4

这完全取决于你,你可以做任何一种方式。但是,您只需要问自己,这种风格是否符合公司准则,以及您希望此代码的可读性如何?

使用 if 语句更具可读性。

就个人而言,我只将三元运算符用于简单而快速的真/假条件——这样做是有意义的——或者我需要“内联”的东西。

于 2009-05-15T17:10:11.223 回答
2

这两种方法中的任何一种都是可以接受的,尽管你也可以这样写:

alert((x == y) ? "yo!" : "meh!");

除此之外,我绝不建议对多行语句使用内联条件,只需使用标准 if/else 块。鉴于您输入的语法也不是有效的 JS,您可以将多个语句放入匿名方法和 yada yada 中,然后您会进入一个几乎无法管理和不必要的困难代码的混乱混乱。再说一次,标准 if/else。

于 2009-05-15T17:09:11.337 回答
2

我同意 Chris 和 JP 的观点:

  1. 条件运算符对于简短的语句很方便。JP 的变量赋值就是一个很好的例子:var a = x ? 1 : 2;
  2. 为了便于阅读,多语句子句应分隔成单独的行。
  3. 条件运算符可以作为具有正确缩进的多行语句可读,但if/else大多数开发人员更熟悉语法。可读性是关于匹配读者的期望,所以熟悉度很重要。

我将补充一点,多行条件运算符会让您容易遇到分号插入错误。查看JSLint 文档(参见“换行”部分)了解更多信息。如果必须使用多行条件运算符,请确保运算符位于每行的末尾。因此,我将修改 JP 的多行示例:

(something && somethingElse > 2) ?
   doSomeLongFunctionName() :
   doSomeOtherLongFunctionName();

如前所述,那里有许多风格指南,您可以选择您喜欢的任何一种。然而,有些选择比其他选择更容易出错。一定要仔细看看JSLint 文档;这是一个经过深思熟虑的风格指南,如果你坚持下去,你甚至可以使用 JSLint 工具自动检查你的代码是否存在潜在问题。

于 2009-05-15T21:26:43.197 回答