第十二章:第14节JavaScript对象——对象在内存中的分配及各种数据类型传值问题

更新于:2024-03-23 23:51:38

在学习PHP对象时,第七章5节《PHP对象在内存中的分配》给大家分享了一篇文章,主要介绍PHP对象数据是怎么加载到内存中的。这节我们看下JS对象在内存中的分配以及各种数据类型传值的问题。


与对象有关系的内存区域:


①. 栈空间

存放的数据大小比较小,一般固定大小的信息适合存放在该空间,例如 整型、boolean、对象的引用(名称)。


②. 堆空间

该空间存储的数据比较多,空间较大,一般数据长度不固定的信息在该空间存放,例如: string、Array、对象实体


③. 数据空间

该空间存放常量、类的静态属性


④. 代码空间

存放函数体、方法体代码


1.png


分析:


JS和PHP一样的,对象变量在栈空间,它存储的数据是对象的引用(姑且这里也叫对象标识符吧,或者理解为内存地址)。JS对象真正的数据是存储在堆空间,这点和PHP也是一样的。下面做示例,通过传值来检验是不是引用关系:


1.png


17行代码,cat对象赋值给一个新对象变量tiger,此刻它俩的值是一样的,是同一个对象标识符。看结果:


1.png


cat对象的name属性也变成了“东北虎”。和我们预想的是一样。


拷贝传值和引用传值


我们再做下深入的探讨,在JS中一切都是对象,包括字符串都是对象(JS有字符串对象String)。对象是引用传值,那JS的字符串是引用传值吗?做下演示:


1.png

1.png


通过上面三个示例,可知道字符串不是引用传值而是拷贝传值。为什么会这样呢?


JS对象是引用传值,这句话没有错的。可String内置对象对“=”运算符做了改变,“=”不再是赋值(对象标识符)的意思,而是拷贝(整个对象)的意思。


哪些数据类型是拷贝传值?


所谓“拷贝传值”,就是将一个变量的值,“拷贝”一份,传给了另一个变量。

两个变量没有任何联系,也就是说,修改其中一个变量的值,另一个变量的值不会变。

这两个变量是相互独立的,没有任何联系。


哪些数据类型的变量,是“拷贝传值”呢?

基本数据类型的变量,都是“拷贝传值”。

 

基本数据类型的存储,是将变量名和值,同时存入“栈内存”,也称为“快速内存”。如果将基本数据类型,作为数据,传给另一个变量时,它们使用的方式就是“拷贝传值”。


1.png


字符串本质上是对象,但JS把它归类为基本数据类型,它支持的是“拷贝传值”。


哪些数据类型是引用传值?


对象是“引用传值”。


对象类型的存储分两个部分。一是变量名称和数据地址它们存在“栈内存”中。二是具体的数据存在“堆内存”“慢速内存”中。当某一个变量的数据更改以后,那么另一个变量也会跟着变。


将对象类型,传给另一个变量,是将这个变量“地址”拷贝一份,传给了另一个变量。那么,这两个变量之间是相互关联的,修改其中一个变量的值,那么另一个变量也会跟着变。


1.png


重点注意下JS的数组:


1.png

1.png


JS数组是对象,所以它是引用传值。而PHP数组是拷贝传值的,不一样,要格外注意。


本节学习代码》》》