一道关于对象赋值的js面试题

  var a = { n : 1};  
  var b = a;  
  a.x = a = {n:  2};  
  alert(a.x);  
  alert(b.x);           

输出:undefined
[object Object]
请问:a.x = a = {n: 2}; 该句是如何赋值的?

阅读 3.1k
4 个回答

其实这类问题很容易理解,只需要记得变量只是对象的引用,变量并不是对象本身。

  1. 取值的时候顺着变量找到对象;
  2. 赋值的时候则改变变量的指向。

所以

  1. 对于 var a = {n: 1},想象一个对象 {n: 1} 放地上,用 a 指着它;
  2. var b = a 就是 b 顺着 a 找到 {n: 1},两者同时指着它;
  3. a.x = a = {n:2} 左往右看,

    1. a.x 是对 a 取值,顺着 a 找到 {n: 1},再找到其 x 属性等待赋值,
    2. 第二个 a 本应是取值,但右边有 = 所以继续变成了赋值操作,a 指向 {n:2}
    3. a = {n:2} 返回 {n:2},给了等待赋值的 {n: 1}.x
  4. alert(a.x),顺着 a 找到 {n:2},因为在 3.2 中 a 改变了指向,而 {n: 2} 没有 x 属性;
  5. alert(b.x),顺着 b 找到 {n: 1}{n: 1}在 3.1 得到了 x,顺着 x 找到了 {n: 2}
  var a = { n : 1};  
  var b = a;  

  //语句从左到右执行,赋值从右到左。
  //执行a.x时,a还是指向的是{n:1}的空间。
  //赋值a时,a指针指向了{n:2},a.x中a原来指向的空间{n:1}添加x属性,指向现在a指向的空间{n:2};

  a.x = a = {n:  2};  
  console.log(a.x);      //undefined
  console.log(b.x);     //{n:2} 

应该是从右到左的。a.x=a={n:2},
先是执行a.x此刻a指向{n:1},
然后执行 a={n:2}将a重新指向,
最后执行a.x=a,即{n:1}.x = {n:2}.

a.x=a={n:2}
可以理解成先定义了set所以赋值没有影响到
定义asetx=bsetx
asetx(a={n:2})

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题