js的存储区
程序运行的时候,需要内存空间存放数据。一般来说,系统会划分出两种不同的内存空间:
-
栈(stack):
自动分配
的内存空间,大小和生存期是确定的,它由系统自动释放,寻址比堆快。栈中主要存放的是基本类型的值以及指向堆中的数组或者对象的地址。 -
堆(heap) :
动态分配
的内存,大小不定也不会自动释放。(因此需要浏览器提供的垃圾回收机制进行内存的回收,否则可能会导致内存泄漏)
PS 1:栈的数据共享
栈有一个很重要的特殊性,就是存在栈中的数据可以共享
假设我们同时定义 int a = 3; int b = 3;
,编译器先处理 int a = 3;
首先它会在栈中创建一个变量为 a 的引用,然后查找有没有字面值为 3 的地址,没找到,就开辟一个存放 3 这个字面值的地址,然后将 a 指向 3 的地址
接着处理 int b = 3;
,在创建完 b 的引用变量后,由于在栈中已经有 3 这个字面值,便将 b 直接指向 3 的地址。这样,就出现了 a 与 b 同时均指向 3 的情况。
特别注意的是,这种 字面值的引用
与 类对象的引用
不同。假定两个类对象的引用同时指向一个对象,如果一个对象引用变量修改了这个对象的内部状态,那么另一个对象引用变量也即刻反映出这个变化
相反,通过字面值的引用来修改其值,不会导致另一个指向此字面值的引用的值也跟着改变的情况。如上例,我们定义完 a 与 b 的值后,再令 a=4;
,那么,b 还是等于 3
在编译器内部,遇到 a=4;
时,它就会重新搜索栈中是否有 4 的字面值,如果没有,重新开辟地址存放 4 的值;如果已经有了,则直接将 a 指向这个地址。因此 a 值的改变不会影响到 b 的值
PS 2:
ssss
数据类型
- 基本数据类型:String、Number、Boolean、Symbol、Undefined、Null
- 引用数据类型:Object
基本数据类型(栈)
- 存储在
栈
中 - 直接按
值
存放的,所以可以直接访问。 - 在 JavaScript 中,
字符串
的值是不可变的,这意味着一旦字符串被创建就不能被改变(即:js中基本数据类型的值不可变)
PS:string类型
//示例1
var str = "hello";
str += "world";
console.log(str); //helloworld
//示例2
var myStrNew = "Bob";
myStrNew = "Job";
console.log(myStrNew); //Job
//示例3
var myStr = "Bob";
myStr[0] = "J";
console.log(myStr); //Bob
引用数据类型(堆)
存储在 堆
中