为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

鸿蒙传说 2018-08-02 13:25:08
  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 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

  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} 


查看完整回答
反对 回复 2018-08-05
?
墨色风雨

TA贡献1853条经验 获得超6个赞

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

查看完整回答
反对 回复 2018-08-05
?
ibeautiful

TA贡献1993条经验 获得超5个赞

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

  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}


查看完整回答
反对 回复 2018-08-05
  • 3 回答
  • 0 关注
  • 1116 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信