扩展三元表达式
Extended Ternary expression
我知道您可以在 Javascript 中为 if - else 语句执行三元表达式,但是 else- else if- else 语句怎么样?我认为这肯定会得到支持,但我无法找到有关它的任何信息,也无法让它正常工作。
由于可读性,我不推荐它,但您可以嵌套三元运算符:
var y = (x == 0 ? "zero" : (x == 1 ? "one" : "other"));
这相当于:
var y;
if (x == 0) {
y = "zero";
} else if (x == 1) {
y = "one";
} else {
y = "other";
}
与 Robby Cornelissen 的回答相反——如果你正确地格式化它(而不是写 PHP,那么可读性就没有问题,因为它使运算符与所有其他运算符相比是左关联的,从而弄乱了运算符具有该结构的语言):
var y =
x == 0 ? "zero" :
x == 1 ? "one" :
"other";
编辑
What I was looking for is a shorter version of "if expression 1 is true, return expression 1. Else if expression 2 is true, return expression 2. Else return expression 3". Is there no clean way to do this?
有:expression1 || expression2 || expression3
。 (如果你一开始就把这个放在你的问题中就好了。)这通常用于默认值:
var defaults = null;
function hello(name) {
var displayName = name || (defaults && defaults.name) || "Anonymous";
console.log("Hello, " + displayName + ".");
}
hello("George");
// => Hello, George.
hello();
// => Hello, Anonymous.
defaults = {};
hello();
// => Hello, Anonymous.
defaults.name = "You"
hello();
// => Hello, You.
但是,了解真实性的条件很重要。例如,如果您希望 ""
或 0
是一个不需要被默认替换的有效值,代码将失败;只有当可能的非默认值集合恰好是真值集合时,这个技巧才有效,不多也不少。例如
function increment(val, by) {
return val + (by || 1); // BUG
}
increment(10, 4);
// => 14
increment(10, 1);
// => 11
increment(10);
// => 11
increment(10, 0);
// => 11 <-- should be 10
在这种情况下你需要明确:
function increment(val, by) {
return val + (typeof(by) === "undefined" ? 1 : by);
}
如果你做得好,可以扩展三元条件。虽然它变得凌乱。
var number = 5;
var power = 2;
var ans = Math.pow(number,power);
var suggest = ( ans == 5 ? 5 : ans == 10 ? 10 : ans == 15 ? 15 : ans == 25 ? "works" : null);
console.log(suggest);
我可能已经添加了很多,因为我在 phone 哈哈,但请在您的开发人员面板中尝试。
我知道您可以在 Javascript 中为 if - else 语句执行三元表达式,但是 else- else if- else 语句怎么样?我认为这肯定会得到支持,但我无法找到有关它的任何信息,也无法让它正常工作。
由于可读性,我不推荐它,但您可以嵌套三元运算符:
var y = (x == 0 ? "zero" : (x == 1 ? "one" : "other"));
这相当于:
var y;
if (x == 0) {
y = "zero";
} else if (x == 1) {
y = "one";
} else {
y = "other";
}
与 Robby Cornelissen 的回答相反——如果你正确地格式化它(而不是写 PHP,那么可读性就没有问题,因为它使运算符与所有其他运算符相比是左关联的,从而弄乱了运算符具有该结构的语言):
var y =
x == 0 ? "zero" :
x == 1 ? "one" :
"other";
编辑
What I was looking for is a shorter version of "if expression 1 is true, return expression 1. Else if expression 2 is true, return expression 2. Else return expression 3". Is there no clean way to do this?
有:expression1 || expression2 || expression3
。 (如果你一开始就把这个放在你的问题中就好了。)这通常用于默认值:
var defaults = null;
function hello(name) {
var displayName = name || (defaults && defaults.name) || "Anonymous";
console.log("Hello, " + displayName + ".");
}
hello("George");
// => Hello, George.
hello();
// => Hello, Anonymous.
defaults = {};
hello();
// => Hello, Anonymous.
defaults.name = "You"
hello();
// => Hello, You.
但是,了解真实性的条件很重要。例如,如果您希望 ""
或 0
是一个不需要被默认替换的有效值,代码将失败;只有当可能的非默认值集合恰好是真值集合时,这个技巧才有效,不多也不少。例如
function increment(val, by) {
return val + (by || 1); // BUG
}
increment(10, 4);
// => 14
increment(10, 1);
// => 11
increment(10);
// => 11
increment(10, 0);
// => 11 <-- should be 10
在这种情况下你需要明确:
function increment(val, by) {
return val + (typeof(by) === "undefined" ? 1 : by);
}
如果你做得好,可以扩展三元条件。虽然它变得凌乱。
var number = 5;
var power = 2;
var ans = Math.pow(number,power);
var suggest = ( ans == 5 ? 5 : ans == 10 ? 10 : ans == 15 ? 15 : ans == 25 ? "works" : null);
console.log(suggest);
我可能已经添加了很多,因为我在 phone 哈哈,但请在您的开发人员面板中尝试。