Javascript内联if语句

时间:2018-05-14 12:18:45

标签: javascript

我在javascript控制台中有一些奇怪的结果。我试图寻找三元运算符的替代(更易读)版本,只是为了好玩。打字:

{ if(3===4) {5} else {6} }

在我的控制台中评估为6,但出于某种原因,我无法将其分配给变量,因此运行:

let a = { if(3===4) {5} else {6} }

不允许我直接将它存储到变量中。所以我的主要问题是,如果这个块正在返回一些东西,为什么我不能分配它?

4 个答案:

答案 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;
}