先说定义
基础类型
es5中基础类型包括:number,string,null,undefined,Boolean。es6新增了一种基础类型symbol,基础类型的存储是存放在栈中,原因是基础类型存储的空间很小,存放在栈(stack)中方便查找,且不易于改变 。 基础类型的值存放在栈内存里数据不能修改,如果要修改一个值,会新建一个新值,不会修改原始值。(这里简单的说就是那些非多个值同时组合起来的类型)
引用类型
引用类型是指有多个值构成的对象,也就是对象类型比如:Object,Array,Function,Data funtion(函数也是)等,js的引用数据类型是存储在堆中(heap),也就是说存储的变量处的值是一个指针(point),指向存储对象的内存地址。存在堆中的原因是:引用值的大小会改变,所以不能放在栈中,否则会降低变量查询的速度 引用类型的值是可以修改的。(记住多个值就对了,还有函数也是哦,因为是多个值嘛。)
来点例子
var obj5 = {a:3};
var obj6 = obj5;
obj5.a = 6;
obj5 = {a:8}
console.log(obj5.a);//8
console.log(obj6.a);//6
这个例子中obj5.a是8,obj6.a是6。具体详解见下图的堆栈图。自己手动画的有点丑。
从上面的图中我们可以清晰的看到obj6因为是新建的原因,在站内存中新建了一个新的内存存储,那个obj5.a在原有的基础上的覆盖,所以会直接修改堆内存中的值。
这边给大家提供一个好理解的方法。
所谓引用类型的值改变是obj5.c是说的这种值,基础类型中的是一个单独的值,比如obj6这种就只能重新新建去修改值,即在比较的时候是不一样的是false