JavaScript有左值和右值的概念吗?

Does JavaScript have the concept of l-value and r-value?

在JavaScript中,如果你把某种表达式放在赋值表达式的左边,引擎会抛出一个ReferenceError。例如,

// 'this' on the left side
this = window; // ReferenceError: Invalid left-hand side in assignment

// function call expression on the left side
var a;
var fn = function() {return a};
a === fn(); // true
a = 1; // 1
fn() = 5; // ReferenceError: Invalid left-hand side in assignment

var a;
a = 1; // 1
(a) = 2; // 2
(1, a) = 3; // ReferenceError: Invalid left-hand side in assignment

我的问题是:

  1. JavaScript难道C也有左值和右值的概念?

  2. 为什么函数调用表达式不能出现在赋值表达式的左边?在上面的例子中,由于 a === fn()a = 5fn() = 5 之间有什么区别?我知道 ES5 规范要求这样做,但为什么要这样设计?

如果您在调用函数之前将对象分配给 af() 可以计算为引用的事实不会改变 f() 是表达式的事实(与例如 1+a 相同)。赋值只能应用于变量。 MDN

同样,在 JavaScript 语言的世界观中,“this(必然...) 神圣不可侵犯。”

目的, this 变量的当前值,必然受到保护,不会被程序任意修改。

同样,"you simply cannot say that 'a function,' whatever it is, 'is equal to '5'."(很明显,其中一个是 "function,",另一个是 "an integer constant,",所以 "never the twain shall meet.")

JavaScript 解释器,就像这个星球上的所有其他语言解释器一样,是使用相同的语言实现策略(和工具...)设计和构建的 被发明的所有其他语言所采用。

根据 specification of assignments,以下表达式作为赋值目标无效:

this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
RegularExpressionLiteral
TemplateLiteral

例如,以下赋值也是无效的:

this    = "bar"; // this
"foo"   = "bar"; // Literal
/foo/   = "bar"; // RegularExpressionLiteral
["foo"] = "bar"; // ArrayLiteral