JavaScript-可以在变量声明期间定义先前声明的对象的属性吗?

时间:2019-06-16 00:12:20

标签: javascript object properties variable-declaration

滥用赋值运算符的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

2 个答案:

答案 0 :(得分:1)

该行:

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 = 9y = x.l之前被分配,即使它在右边

现在用第二个例子尝试一下:

var t = {}, t.l = 9;

成为:

// Parse phase
var t;   // assigned the value undefined
var t.l; // syntax error, stop

语句开始处的 var 关键字表示下一件事必须是有效的标识符。 t.l不是有效的标识符(只能解释为标识符,后跟点属性访问器),仅此而已。一切都停止了。

答案 1 :(得分:0)

您需要使用分号-这就是解析器期望的错误:

var t = {}; 
t.l = 9;
console.log(t);