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

标签 javascript expression ecmascript-5 referenceerror

在 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 规范要求这样做,但为什么要这样设计?

最佳答案

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

this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
RegularExpressionLiteral
TemplateLiteral

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

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

关于javascript - JavaScript有左值和右值的概念吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30770292/

相关文章:

javascript - 替换文本,但忽略文档中的某个字符串

javascript - 我如何从 js 为 html 输出一个变量

javascript - 动态更改 CSS,某些 CSS 规则不起作用

java - 正则表达式 foo_bar_number 为 2 个字符串 [foo_bar, number]?

Java Scanner hasNext() 字符串正则表达式验证

javascript - 新 ECMA5 Javascript 标准中的 argument.callee.name 替代方案

JavaScript 数组 : Change elements from string to object

c# - 从对象创建动态 Func<T, TResult>

javascript - 异步/等待失败的 Angular promise

javascript - es6代码剪断不清楚