面向对象在javascript中的实践之内存分析
来源:互联网 发布:公司取名软件注册码 编辑:程序博客网 时间:2024/06/10 01:06
分析下面代码的结果,并且阐述原因:
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}。
画个图来说明问题吧:
0 0
- 面向对象在javascript中的实践之内存分析
- 面向对象之内存分析(一)
- 面向对象之内存分析(二)
- 面向对象之内存分析(三)
- 面向对象之内存分析(五)
- 第十三、Java面向对象之内存分析
- 面向对象在javascript中的实践之大杂烩
- Java之内存分析和String对象
- Java之内存分析和String对象
- Java之内存分析和String对象
- Java之内存分析和String对象
- Java之内存分析和String对象
- Java之内存分析和String对象
- Java之内存分析和String对象
- Java之内存分析和String对象
- Java之内存分析和String对象
- Java之内存分析和String对象
- Java之内存分析和String对象
- Docker隔绝上传文件
- python中的函数式编程——apply, filter, map, reduce
- Python reverse order
- MapReduce处理多个不同的出入文件
- java毕向东听课笔记2(函数的重载)
- 面向对象在javascript中的实践之内存分析
- 查看mysql安装版本
- WPF学习——依赖项属性(3)
- leetcode 210. Course Schedule II
- 关键字
- js高级程序设计笔记1
- linker command failed with exit code 1 (use -v to see invocation)
- Linux下给树莓派安装及配置系统
- 把数组排成最小的数