JavaScript连续赋值的思考

起因

今天刷题,遇到一道很坑的问题:

下面代码执行后,foo.x的值是?
    var foo = {n:1};
    var bar = foo;
    foo.x = foo = {n:2};

这道题说实话我一开始也是懵的,没看懂,
这里还要吐槽为什么出题人总能想到这么奇葩的问题。

查了下资料,其实连续赋值问题很多人都讨论过(果然还是自己太嫩)

这里再贴一个网上讨论比较多的代码

    var a = {n:1};  
    a.x = a = {n:2};  
    alert(a.x); // --> undefined  

为什么a.x未定义?

我看了几篇博客后,觉得有一篇博客解释的很好
http://justjavac.com/javascript/2012/04/05/javascript-continuous-assignment-operator.html

里面是这样解释的:

a.x = a = {n:2};  

a.x 中的a指向的是 {n:1},a 指向的是 {n:2}。

              a.x  =  a  = {n:2}
              │      │
      {n:1}<──┘      └─>{n:2}

其实看到这里已经算是解释清楚了,
但是有的同学就要问了,那有一个a确实有了x属性了啊!
所以我觉得还是要来最后一下,否则有一些像我一样迟钝的人还是没反应过来:

回到代码,

var a = {n:1};  
a.x = a = {n:2};  
alert(a.x); // --> undefined  

第二行中,第一个a.x指向原来的a,第二个a被赋值为{n:2}

最后的情况如下:

旧的 a == {n:1,x:{n:2}};
新的 a == {n:2}; 

那么在第三行中,alert的a是哪个a?
答案应该是,第二个a,是新的a,新的a没有 x 属性,
所以alert的时候报了undefined。

回到开头,
下面代码执行后,foo.x的值是?

    var foo = {n:1};
    var bar = foo;
    foo.x = foo = {n:2};

答案应该是 undefined
这里,第一个foo.x还是原来的foo
第二个foo,是新的foo,这个新的foo没有x 属性

所以执行后,foo.x找到的是新的foo,不会找原来的foo,而是找的新的foo,新的foo没有x属性,所以是undefined。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值