三元运算符

可用于缩短 if / else 操作。这对于快速返回值(即将其分配给另一个变量)非常方便。

例如:

var animal = 'kitty';
var result = (animal === 'kitty') ? 'cute' : 'still nice';

在这种情况下,result 获得’可爱’值,因为动物的价值是’小猫’。如果动物有另一个值,结果将获得仍然很好的值。

将此与 if/else 条件的代码相比较。

var animal = 'kitty';
var result = '';
if (animal === 'kitty') {
    result = 'cute';
} else {
    result = 'still nice';
}

ifelse 条件可能有几个操作。在这种情况下,运算符返回最后一个表达式的结果。

var a = 0;
var str = 'not a';
var b = '';
b = a === 0 ? (a = 1, str += ' test') : (a = 2);

因为 a 等于 0,它变成 1,而 str 变成’不是测试’。涉及 str 的操作是最后一个,所以 b 接收操作的结果,这是 str 中包含的值,即 not a test

三元运算符总是期望其他条件,否则你将得到语法错误。作为一种解决方法,你可以在 else 分支中返回类似零的东西 - 如果你没有使用返回值而只是缩短(或试图缩短)操作,这无关紧要。

var a = 1;
a === 1 ? alert('Hey, it is 1!') : 0;

如你所见,if (a === 1) alert('Hey, it is 1!'); 会做同样的事情。它只是一个更长的字符,因为它不需要强制性的 else 条件。如果涉及 else 条件,三元方法将更清洁。

a === 1 ? alert('Hey, it is 1!') : alert('Weird, what could it be?');
if (a === 1) alert('Hey, it is 1!') else alert('Weird, what could it be?');

三元组可以嵌套以封装其他逻辑。例如

foo ? bar ? 1 : 2 : 3

// To be clear, this is evaluated left to right 
// and can be more explicitly expressed as:

foo ? (bar ? 1 : 2) : 3

这与以下 if/else 相同

if (foo) {
  if (bar) {
    1
  } else {
    2
  }
} else {
  3
}

在风格上,这应该仅用于短变量名称,因为多行三元组可能会大大降低可读性。

唯一不能在三元组中使用的语句是控制语句。例如,你不能使用三元组的 return 或 break。以下表达式无效。

var animal = 'kitty';
for (var i = 0; i < 5; ++i) {
    (animal === 'kitty') ? break:console.log(i);
}

对于 return 语句,以下内容也将无效:

var animal = 'kitty';
(animal === 'kitty') ? return 'meow' : return 'woof';

要正确执行上述操作,你将返回三元组,如下所示:

var animal = 'kitty';
return (animal === 'kitty') ? 'meow' : 'woof';