大家对这道面试题,怎么理解的?
发布于 9 年前 作者 mlyknown 5267 次浏览 最后一次编辑是 8 年前 来自 问答
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语法

14 回复

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

@zeroone001

var a = {n: 1};
var b = a;
a = {n: 2}; // a指向新的对象
a.x = {n:2}; // 新的对象的x属性赋值
console.log(b.x);// b 指向的还是原来的 {n: 1}

本来写了很多 结果标签页刷新了。。就放个最后的解析图吧

![IK{Y@0S{~GR{NPT7(X`~PJ.png]

验证一下 a === b.x //true

同样的问题 https://segmentfault.com/q/1010000002637728

我也理解了,谢了

如果说.的优先级高于=,那么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}

不知道理解是否正确,得到的结果是对的,看图: QQ截图20160505114145.png

var a = {n:1} var b = a;内存结构是这样的。a变量指向{n:1}对象,b变量指向{n:1}对象。 untitled4.png 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 untitled5.png

重点还是在于 .运算优先于=赋值运算, 理解了,thanks~~

回到顶部