为什么在赋值中作为左侧的表达式并不总是有效?

Why expression as left-hand side in assignment doesn't always work?

此代码有效:

let foo;

(foo) = 'bar';

console.log(foo);

这让我相信任何表达式都可以作为赋值的左侧,但是,这段代码不起作用:

let foo1 = "bar";
let foo2;
let foo3;
(foo1 && foo2 && foo3) = "foobar"; // The left-hand side evaluates to undefined which can't be assigned

console.log(foo1, foo2, foo3);

是什么让左边在赋值中有效,为什么它不能总是一个表达式?

规范的相关位是here:

It is a Syntax Error if AssignmentTargetType of LeftHandSideExpression is not simple.

here.

简化版本是(如果我们不考虑解构)您可以为变量或对象的 属性 赋值。

给定 (foo),括号没有意义,表达式只是一个变量名。这很好。

给定 (foo1 && foo2 && foo3) 从变量中读取值,使用 && 运算符进行比较,结果是 value.

不能给值赋值,只能给属性或变量赋值。