面向对象在javascript中的实践之内存分析

分析下面代码的结果,并且阐述原因:

var a = {n:1}; 
var b = a;
a.x = a = {n:2};
console.log(a.x); 
console.log(b.x);
一般系统在内存中会开辟两块空间用来存储数据,一个是栈区域(用于存储简单数据类型和变量),一个是堆区域(用于存储复杂数据类型,如函数,数组,对象)。

系统执行var a = {n:1}这句代码时,会开辟一个栈内存和一个堆内存。

在堆内存中存储了一个具体的对象Object {n: 1},在栈内存中存储了指向堆内存这个对象的一个地址a,也称之为指针。

当系统执行到 var b = a; 这句代码时,系统又在栈内开辟了一块空间b,b和a一样,都指向了堆内存中的那个对象Object {n: 1},简称对象①号,b也是一个指针。

当系统执行到这句代码时:a.x = a = {n:2}; 代码中点运算符的优先级比赋值要高,所以a.x优先被执行,a.x=a,表示对象①号Object {n: 1}有个属性x指向了对象a,此时对象①号变成了这样:Object {n: 1, x: Object}。

然后开始执行a = {n:2} ,这时候在堆内存中重新开辟了一块空间用于存储一个新的对象,对象②号 :Object {n:2},此时栈中的a指向了这个新的对象—对象②号。

而对象①号变成了这样Object {n: 1, x: {n:2}} ,此时指针a与对象①号的关系,从此断开了。指针a指向了对象②号。

然后执行 console.log(a.x); 此时要输出的是对象②号的属性x,很显然是undefined。

最后执行console.log(b.x); 指针b一直保存的是对象①号的地址。很显然是个对象{n:2},在控制台上打印出的是这个对象②号即:Object {n: 2}。

画个图来说明问题吧:


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值