js基本数据类型:Number、String、Boolean、Null、undefined、Symbol(es6)
引用数据类型:Object
注:数组、函数、正则表达式都是对象。
1、基本数据类型存放在栈中
基本数据类型存放在栈中,数据大小确定,内存空间大小可以分配,是直接按值存放的,所以可以直接按值访问。
这种基本数据类型赋值的过程如下图所示:
栈内存:
2、引用数据类型存放在堆中
引用数据类型存放在堆中,每个空间大小不一样,要根据情况 进行分配。
变量保存的是在栈内存中的一个指针,该指针指向堆内存,也就是说变量是存在栈中的一个地址,地址是该引用数据在堆中的地址。通过这个地址可以找到保存在堆内存中的对象。
说明这两个引用数据类型指向的是同一个堆内存对象,obj1的值赋值给obj2得到值,给的是obj1在栈中的地址,实际上他们指向了堆中存储的同一个对象,所以修改obj2的name值,其实就是修改了堆内存中的那个对象,所以通过obj1也可以访问到。
a是数组,是引用数据类型,var b = a是将a的地址赋值给了b,所以修改b,相当于修改了堆中的对象,所以a也会改变。c只是将a数组中的元素,存在栈中,是基本数据类型,修改栈中的数据不会影响堆。
在面试中遇到了,所以进行一个比较清晰的总结~
这方面的知识点会涉及到一个深拷贝和浅拷贝,可以参考一下连接。
参考:
https://www.cnblogs.com/c2016c/articles/9328725.html