您的位置:首页 > Web前端 > JavaScript

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

2016-03-25 23:31 369 查看
分析下面代码的结果,并且阐述原因:

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}。

画个图来说明问题吧:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: