为什么会这样,我不知道。而且我无法弄清楚任何单词组合来描述 it 是什么,所以我很难谷歌。
apple =
banana =
orange = true;
console.log(banana); //true
这种奇怪的JavaScript简写是什么?它为什么有效?
答案 0 :(得分:1)
赋值只是javascript中的表达式,并产生右侧值。所以您的代码段is parsed为
(apple = (banana = (orange = (true))));
并且(大约 1 )具有与
相同的效果orange = true;
banana = true;
apple = true;
// (since the literal `true` has no side effects when being evaluated)
布尔值没有什么特别的。
1:嗯,它不是完全相同。但是edge cases无关紧要。
答案 1 :(得分:0)
澄清后编辑
apple = banana = orange = true;
据我所知,值为true分配给橙色,橙色值分配给香蕉,香蕉的值分配给苹果。
答案 2 :(得分:0)
您正在做的是将多个变量分配给相同的值。它几乎只是说“苹果等于香蕉,等于橙色,等于真”。
这是有效的,因为在ECMA脚本(#11.13.1)中定义了分配方式。为了简化它,指定变量(AssignmentExpression
)需要具有以下形式:
LeftHandSide = AssignmentExpression
由于最后还有另一个AssignmentExpression
,因此可以扩展为
LeftHandSide = LeftHandSide = AssignmentExpression
这被称为Recursive Grammar Definition。这属于语言和无上下文语法定义领域。如果你研究编译器,也会出现这种情况。
答案 3 :(得分:-1)
这在java脚本中称为分号插入,有javascript用于检查行的sevaral规则是一个有效的js语句。你可以阅读more here .. 例如,
function multiply(a, b) {
return
a * b;
}
返回undefined因为"返回"是一个有效的js语句。所以它变成了,
function multiply(a, b) {
return;
a * b;
}
但你的代码是similer to
apple = banana = orange = true;
即使它们在不同的行中