JavaScript 中的栈与堆-基本数据类型与引用类型
来源:互联网 发布:单片机读写u盘模块 编辑:程序博客网 时间:2024/05/21 09:01
一、 堆(heap)和栈(stack)
栈(stack)会自动分配内存空间,会自动释放。堆(heap)动态分配的内存,大小不定也不会自动释放。
二、 基本类型和引用类型
基本类型:简单的数据段,存放在栈内存中,占据固定大小的空间。
引用类型:指那些可能由多个值构成的对象,保存在堆内存中,包含引用类型的变量实际上保存的不是变量本身,二十指向该对象的指针。
基本数据类型包括Undefined,String,Boolean,Null,Number
三、 传值和传址
从一个向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终指向同一个对象。即复制的是栈中的地址而不是堆中的对象。
从一个变量复向另一个变量复制基本类型的值,会创建这个值的副本。
事例:
var a = [1,2,3,4,5];var b = a;//传址 ,对象中传给变量的数据是引用类型的,会存储在堆中;var c = a[0];//传值,把对象中的属性/数组中的数组项赋值给变量,这时变量C是基本数据类型,存储在栈内存中;改变栈中的数据不会影响堆中的数据alert(b);//1,2,3,4,5alert(c);//1//改变数值 b[4] = 6;c = 7;alert(a[4]);//6alert(a[0]);//1
从上面我们可以得知,当我改变b中的数据时,a中数据也发生了变化;但是当我改变c的数据值时,a却没有发生改变。
这就是传值与传址的区别。因为a是数组,属于引用类型,所以它赋予给b的时候传的是栈中的地址(相当于新建了一个不同名“指针”),而不是堆内存中的对象。而c仅仅是从a堆内存中获取的一个数据值,并保存在栈中。所以b修改的时候,会根据地址回到a堆中修改,c则直接在栈中修改,并且不能指向a堆内存中。
前面已经提到,在定义一个对象或数组时,变量存放的往往只是一个地址。当我们使用对象拷贝时,如果属性是对象或数组时,这时候我们传递的也只是一个地址。因此子对象在访问该属性时,会根据地址回溯到父对象指向的堆内存中,即父子对象发生了关联,两者的属性值会指向同一内存空间。
var a = { key1:"11111" } function Copy(p) { var c = {}; for (var i in p) { c[i] = p[i]; } return c; } a.key2 = ['张三','李四']; var b = Copy(a); b.key3 = '33333'; alert(b.key1); //1111111 alert(b.key3); //33333 alert(a.key3); //undefined
a对象中key1属性是字符串,key2属性是数组。a拷贝到b,12属性均顺利拷贝。给b对象新增一个字符串类型的属性key3时,b能正常修改,而a中无定义。说明子对象的key3(基本类型)并没有关联到父对象中,所以undefined。
b.key2.push("龙门课栈"); alert(b.key2); //张三,李四,龙门课栈 alert(a.key2); //张三,李四,龙门课栈
但是,若修改的属性变为对象或数组时,那么父子对象之间就会发生关联。从以上弹出结果可知,我对b对象进行修改,a、b的key2属性值(数组)均发生了改变。其在内存的状态,可以用下图来表示。
原因是key1的值属于基本类型,所以拷贝的时候传递的就是该数据段;但是key2的值是堆内存中的对象,所以key2在拷贝的时候传递的是指向key2对象的地址,无论复制多少个key2,其值始终是指向父对象的key2对象的内存空间。
- JavaScript 中的栈与堆-基本数据类型与引用类型
- js中的栈与堆的讲解/基本数据类型与引用类型的讲解
- JavaScript中的基本类型与引用类型
- javascript基本数据类型与值类型引用类型说明
- 好博客要记录:JVM基础概念总结:数据类型、堆与栈、基本类型与引用类型
- Java中的基本数据类型与引用数据类型
- Java中的Final关键字,区分基本数据类型与引用类型,值传递与引用传递
- javascript基本类型与引用类型
- javascript基本类型与引用类型
- JavaScript中的值类型与引用类型
- JavaScript中的值类型与引用类型
- JavaScript 基本数据类型 与类型检测
- 初识JavaScript中的基本数据类型和引用类型
- 基本数据类型与引用数据类型
- JavaScript中的基本数据类型和引用数据类型
- javascript类型系统之基本数据类型与包装类型
- 一张图表明JAVA中基本数据类型与引用类型
- JavaScript读书笔记---基本数据类型string与基本包装类型String
- 系统调用&函数调用
- Lintcode:合并排序数组
- Qt之QTcpServer/QTcpSocket简单收发信息(1)
- 【配置】sqoop安装配置
- rabbitmq启动报错
- JavaScript 中的栈与堆-基本数据类型与引用类型
- Java知识点-8大数据类型
- JS
- Hadoop2.7.2 HBase2.0.0环境搭建
- JWT简介
- Apache POI
- 微信小程序实战:厕所雷达
- mac下* daemon not running.starting it now on port 5037 * 问题解决
- unity shader—高斯模糊效果