var a = {n: 1}
var b = a;
a.x = a = {n: 2}
console.log(a.x);
console.log(b.x)
关键点是 a.x = a = {n: 2};
从右到做赋值。
在我的理解下最后 a:{x:{n:2},n:2} b:{x:{n:2},n:2}
但是结果却不是这么回事~~~
管理员温馨提示:发帖前请先简单学一下Markdown语法
a.x = a; a = {n: 2}; 没这样用过.
这个其实是js的赋值表达式的运算! =是从右往左边赋值,a=b=c=1,那么abc都会等于1。 这里计算逻辑大概是这样: a=1; b=1; c=1; 面试代码运行逻辑也是类似, a.x = {n: 2}; a = {n: 2}; 看明白了吗?
顺便说下,4楼说的比较对, 我这个只是让你更快的理解,但是本质上这是错的,正确的请参照4楼说明!
.的优先级比=高
3楼说的是关键
var a = {n: 1}
var b = a;
a.x = a = {n: 2}
// 相当于
// (a.x) = (a = {n:2})
// 大概下面这样
// (a.x原来指向的内存) = (a = {n:2})
// 执行 (a = {n:2})
// a 指向了一个新的对象, 同时这个表达式返回这个对象
// 执行 (a.x原来指向的内存) = 上面说的新的对象
console.log(a.x);
console.log(b.x);
console.log(b.x === a); // true
@William17 还是不太明白a.x为什么是undefined,还有我稍微改了一下var a = {n: 1} var b = a; a = {n: 2}; a.x = {n:2};console.log(b.x);
这样的话b.x是undefined
var a = {n: 1};
var b = a;
a = {n: 2}; // a指向新的对象
a.x = {n:2}; // 新的对象的x属性赋值
console.log(b.x);// b 指向的还是原来的 {n: 1}
本来写了很多 结果标签页刷新了。。就放个最后的解析图吧
验证一下 a === b.x //true
mark下
3L真给力
我也理解了,谢了
如果说.
的优先级高于=
,那么a.x=a={n:2}
是不是可以理解为:
a.x={n:2};
a={n:2}
这样得到的结果就是正确的。
那么如果再复杂点:
var a={n:1};
var b={n:2};
var c=a;
var d;
b.x=d=a.x=a={n:3}
如果按照上面的理解方法,b.x=d=a.x=a={n:3}
是不是也是等价于:
a.x={n:3};
b.x={n:3};
a={n:3};
d={n:3}
按照这样理解,得到的结果:
a
:{n:3}
b
:{n:2,x:{n:3}}
c
:{n:1,x:{n:3}}
d
:{n:3}
不知道理解是否正确,得到的结果是对的,看图:
var a = {n:1} var b = a;内存结构是这样的。a变量指向{n:1}对象,b变量指向{n:1}对象。 a.x = a = {n:2}可以分解成三步,先创建{n:2}对象,然后a.x = {n:2}对象,再a = {n:2}对象。原来{n:1}对象变成{n:1,x:指向{n:2}},a变量指向{n:2}对象。所以a.x undefined ,b.x = {n:2} ,b.x === a true
重点还是在于 .运算优先于=赋值运算, 理解了,thanks~~