Javascript 这个奇怪的作业速记是什么?为什么它有效?

Javascript 这个奇怪的作业速记是什么?为什么它有效?,javascript,Javascript,我不知道为什么会这样。我无法用任何词语组合来描述它是什么,所以我几乎无法用谷歌搜索它 apple = banana = orange = true; console.log(banana); //true 这个奇怪的JavaScript速记是什么?为什么它能工作?在澄清后编辑 据我所知,true的值分配给orange,orange的值分配给banana,banana的值分配给apple。这在java脚本中被称为分号插入,javascript使用了几种规则来检查行是否是有效的js语句。你可

我不知道为什么会这样。我无法用任何词语组合来描述它是什么,所以我几乎无法用谷歌搜索它

apple = 
banana = 
orange = true;

console.log(banana); //true
这个奇怪的JavaScript速记是什么?为什么它能工作?

在澄清后编辑


据我所知,true的值分配给orange,orange的值分配给banana,banana的值分配给apple。

这在java脚本中被称为分号插入,javascript使用了几种规则来检查行是否是有效的js语句。你可以阅读。。 比如说,

function multiply(a, b) {
    return
    a * b;
}
返回未定义,因为return是有效的js语句。就变成了,

function multiply(a, b) {
    return;
    a * b;
}
但您的代码与

apple = banana = orange = true;

即使它们在不同的行中,赋值也只是javascript中的一个表达式,并产生右边的值。因此,您的代码片段

其效果与

orange = true;
banana = true;
apple = true;
// (since the literal `true` has no side effects when being evaluated)
布尔值没有什么特别的


1:嗯,不完全一样。但是,这些变量并不重要。

您所做的是将多个变量指定给同一个值。它几乎只是说苹果等于香蕉,这等于橘子,这等于真的

这是因为ECMA脚本中定义赋值的方式。为了简化它,为变量赋值AssignmentExpression需要采用以下形式:

LeftHandSide = AssignmentExpression
因为它的末尾有另一个AssignmentExpression,所以可以将其展开以提供

LeftHandSide = LeftHandSide = AssignmentExpression

这就是我们所知道的。这属于语言和上下文无关语法定义领域。如果你学习编译器,这也会出现。

可能有助于将所有作业放在一行。@CuriousProgrammer:那你为什么要把它放在引号里?@Bergi你能适当地重新命名我的问题吗?从这些答案中,我看到它不是简写的,但我不确定如何最好地为寻找答案的其他人命名。
LeftHandSide = AssignmentExpression
LeftHandSide = LeftHandSide = AssignmentExpression