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

先console.log(obj),后给obj添加属性,为什么可以打印出属性?

先console.log(obj),后给obj添加属性,为什么可以打印出属性?

慕侠2389804 2019-03-05 17:12:15
先看一段代码:var obj={b:2};console.log(obj.a);console.log(obj);obj.a=1;console.log(obj);这三个 console.log() 分别输出如下结果:第一个 undefined 我可以理解,但是第二个为什么可以输出 a:1,而且还可以看出第二个和第三个打印的结果有个明显区别:第一个大括号里只有 b:2,而第二个全部输出。求大神解惑?
查看完整描述

2 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

我觉得可能是,你不展开的时候,上面就是显示当时结果字面量输出了,你展开了,下面这个就指向了这个obj的内存地址,里面确实多了一个a属性了

查看完整回答
反对 回复 2019-03-09
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

背后逻辑应该类似这样:


let 简版快照=JSON.parse(JSON.stringify(obj));//返回一个新对象,相当于老对象的快照

let 详情快照=JSON.parse(JSON.stringify(obj));//返回一个新对象,相当于老对象的快照

如果你现在访问了详情,详情快照就确定了,后面不变了,如果你放着,后面再访问,详情快照就暂时没有值,等你加了一个属性,这个时候,再访问前面的,这个时候,前后两个都会执行


JSON.parse(JSON.stringify(obj))

那么这个时候的结果当然是一样的,也就是出现同步;

图解:

https://img1.sycdn.imooc.com//5c836e44000176e203140224.jpg

https://img1.sycdn.imooc.com//5c836e4400010b7103400137.jpg

https://img1.sycdn.imooc.com//5c836e4500013da403720241.jpg

查看完整回答
反对 回复 2019-03-09
  • 2 回答
  • 0 关注
  • 857 浏览
慕课专栏
更多

添加回答

举报

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