![图片上传中...]
<script>
var thinkive={child:1}
var gentou=thinkive
thinkive.kaihu=thinkive={child:2}
debugger
console.log(thinkive.kaihu) //undefined
</script>
![图片上传中...]
<script>
var thinkive={child:1}
var gentou=thinkive
thinkive.kaihu=thinkive={child:2}
debugger
console.log(thinkive.kaihu) //undefined
</script>
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
。
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
https://segmentfault.com/a/11...