从运算符优先级的角度思考(“.”优先级高于“=”),会简单很多,不用这么绕。
1 2 3 4 5 |
var a, b, c, d; a = b = c = d = {a: 1}; a.x = a = b.y = b = c.z = c = {}; console.log(a, b, c, d); console.log(a===b, b===c, c===d, c===d.x, d.x===d.y, d.y===d.z); |
零:声明a、b、c、d,均为undefined。
一:a、b、c、d被赋值,均指向对象Object_1,现在为{a:1}。
二:对象Object_1被声明属性x,现在为{a:1, x:undefined},a.x即为Object_1.x。
三:对象Object_1被声明属性y,现在为{a:1, x:undefined, y:undefined},b.y即为Object_1.y。
四:对象Object_1被声明属性z,现在为{a:1, x:undefined, y:undefined, z:undefined},c.z即为Object_1.z。
五:c被赋值,指向对象Object_2,现在为{}。
六:c.z即Object_1.z,被赋值,指向对象Object_2。
七:b被赋值,指向对象Object_2。
八:b.y即Object_1.y,被赋值,指向对象Object_2。
九:a被赋值,指向对象Object_2。
十:a.x即Object_1.x,被赋值,指向对象Object_2。
结:此时a、b、c、d.x、d.y、d.z均指向对象Object_2,现在为{}。d指向Object_1,现在为{a:1, x:{}, y:{}, z:{}}。