滥用赋值运算符的 RTL 关联性是否是常见做法(或者至少在跨浏览器和 JS 实现的语法上有效),以便可以定义两个变量(第一个是对象),以便将第二个变量分配给该对象的(新)命名属性本身被分配给另一个值,因此不会生成 SyntaxError() ?
我知道这听起来很复杂,但这是代码:
var x = {}, y = x.l = 9; // generates no errors
console.log(x.l, y); // 9 9
自:
var t = {}, t.l = 9; // Syntax Error, no doubt because t is already defined
最佳答案
行:
var x = {}, y = x.l = 9;
实际上变成:
var x = {};
var y = x.l = 9;
处理如下:
// Parse phase
var x; // assigned the value undefined
var y; // assigned the value undefined
// Execution phase
x = {};
x.l = 9;
y = x.l;
请注意,在赋值表达式中,右侧的值将分配给左侧的表达式。复合赋值是从左到右求值,但赋值是从右到左,因此x.l = 9
在y = x.l<之前赋值
,即使它在右侧。
现在尝试第二个示例:
var t = {}, t.l = 9;
变成:
// Parse phase
var t; // assigned the value undefined
var t.l; // syntax error, stop
语句开头的 var 关键字意味着接下来的内容必须是有效的标识符。 t.l
不是一个有效的标识符(它只能被解释为一个标识符后跟一个点属性访问器),所以就是这样。一切都停止了。
关于JavaScript - 在变量声明期间定义先前声明的对象的属性是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56615111/