帮我理解一下这个 js 结果 为什么是undefined

![图片上传中...]

<script>
        var thinkive={child:1}
        var gentou=thinkive
        thinkive.kaihu=thinkive={child:2}
        debugger 
        console.log(thinkive.kaihu) //undefined
    </script>
阅读 3.9k
7 个回答

js连续赋值,这个结合方式是左结合的,和你想的可能不太一样,建议你不要这样写,分开写比较不容易出错,附链接 blog 讲解

thinkive.kaihu=thinkive={child:2}

thinkve 被你用 {child: 2} 覆盖了,当然不会有 kaihu属性了

console.log(gentou.kaihu); 可以输出 {child:2},证明赋值是成功的。

thinkive.kaihu 输出 undefined,只是因为后半句赋值 thinkive={child:2},thinkive被重置了。

    var thinkive={child:1};
    var aa=thinkive;
    var gentou=thinkive
    thinkive.kaihu=thinkive={child:2}
    debugger 
    console.log(aa) 
    console.log(thinkive.kaihu) 
    可以这么理解
   第一步: 解析器先解析等号左边的,thinkive.kaihu中的thinkive引用的是{child:1}这个空间A,这一步空间A变成{child:1,kaihu:undefined};
   第二步:解析器解析等号右边的,thinkive={child:2};
   第三步:解析器解析thinkive={child:2}的左边thinkive;
   第四步:解析器解析{child:2}
   第五步:解析器执行thinkive={child:2}中的=操作,这个操作使得thinkive被重新定义,引用到{child:2}这个空间B;
   第六步:解析器执行thinkive.kaihu=thinkive={child:2}的第一个=操作,将新的thinkive指向的空间B赋值(被引用)到空间A保存的对象{child:1,kaihu:undefined}的kaihu属性中去;
   所以你会看到aa是你想看到的,但是thinkive会出乎意料之外
   
   解释不太清楚,弄清楚对象引用和解析器执行步骤比较关键吧,参考-你所不知道的JavaScript
   
   
   
thinkive.kaihu=thinkive={child:2}

这里thinkive先被赋值为{child:2},
thinkive.kaihu里的thinkive则是指向{child:1}
最后变成{child:1}.kaihu={child:2},赋给了{child:1}
两边的thinkive指向不同,不是同一个thinkive
所以console.log(thinkive.kaihu)thinkive指向的是{child:2}
{child:2}.kaihu并没有被赋值,所以得到undefined

推荐问题
宣传栏