三元运算符
可用于缩短 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';
}
if
或 else
条件可能有几个操作。在这种情况下,运算符返回最后一个表达式的结果。
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';