什么是这种奇怪的任务简写,为什么它有效?

时间:2014-11-10 04:46:40

标签: javascript

为什么会这样,我不知道。而且我无法弄清楚任何单词组合来描述 it 是什么,所以我很难谷歌。

apple = 
banana = 
orange = true;

console.log(banana); //true

这种奇怪的JavaScript简写是什么?它为什么有效?

4 个答案:

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

即使它们在不同的行中