我在javascript控制台中有一些奇怪的结果。我试图寻找三元运算符的替代(更易读)版本,只是为了好玩。打字:
{ if(3===4) {5} else {6} }
在我的控制台中评估为6,但出于某种原因,我无法将其分配给变量,因此运行:
let a = { if(3===4) {5} else {6} }
不允许我直接将它存储到变量中。所以我的主要问题是,如果这个块正在返回一些东西,为什么我不能分配它?
答案 0 :(得分:8)
您的代码无法访问块(和其他语句)返回值的事实。控制台可以查看结果,它存在于语言规范级别,但不存在于您的代码中。
您的选项是条件运算符¹(当您习惯使用它时可以读取,但您已经说过它正在寻找替代方法)或者if
/ else
分配两部分都是a
:
let a;
if (3 === 4) {
a = 5;
} else {
a = 6;
}
或者您可以使用内联函数(IIFE):
let a = (() => { if (3 === 4} return 5 else return 6; })();
还有一个提案是“do
expressions”,它看起来像这样:
// Currently a proposal, not implemented in engines yet
let a = do { if (3 === 4) 5; else 6; };
该提案位于the process的第1阶段,因此它可能会或可能不会进展,如果它进展,它可能会在此之前发生显着变化。
¹尽管您经常看到“三元运算符”,但正确的名称是条件运算符。它是一个三元运算符(一个接受三个操作数的运算符),而且是目前JavaScript唯一的三元运算符,但有一天可能会改变。 : - )
答案 1 :(得分:2)
使用ternary operator,因为您无法指定if
声明:
let a = 3 === 4 ? 5 : 6;
答案 2 :(得分:1)
这不起作用的原因是因为正如你所指出的那样if
是一个陈述。赋值需要表达式保存要分配的值。声明没有(本身)有一个值 - 它只是执行一些副作用。
如果要有条件地分配值,可以使用的是三元条件运算符,它是一个表达式:
let a = (3 === 4 ? 5 : 6)
此时你可能想知道,如果一个语句只是执行副作用,为什么控制台会打印一个值?这是因为语句具有完成值,对于if
语句,它是相应分支的完成值,对于表达式语句(这是5
和块内的6
是),是表达式求值的内容。当你想要在控制台中评估表达式并查看它产生的内容时,这非常有用,而不必每次都发出console.log()
。
答案 3 :(得分:0)
它没有返回任何东西。 if
不是表达,而是声明;没有价值。
三元运算符的目的是提供一个更易读的版本:
let a;
if (condition) {
a = 1;
}
else {
a = 2;
}