一、基本类型:
number , string ,boolean,null ,undefined ,放在栈,栈内存是自动分配内存的。
①基本类型比较是值的比较。
②基本类型是按值访问,可以直接得到变量值。
储存类型:值类型。存的是值,赋值之后原变量值不能改。
注:任何方法都无法改变一个基本类型的值,也不可以添加属性和方法。
let color = 'pink'
color = 'purple'
console.log(color) // 输出:purple
这样看,我们重新赋值,log出好像改变了,实际是指针改变。
如果重新赋值,指针指向新的栈空间,把新值放到新空间。之前的地址就是野房子,之前数据也不会销毁。
二、对象类型/引用类型:
Object ,Function ,Array ,Date等,放在堆,堆内存是动态分配内存的。如果被占用,不能释放,为减少内存消耗,fn=null,手动清除之前的引用。
①引用类型则是按引用访问。在访问引用类型的值时,先得到该值的地址,再通过该地址得到变量值。
②当一个对象赋值给另一个新对象时,用等号作比较就相等,因为引用(内存地址)相同。
附:==和===比的都是内存地址而不是结构。
举个栗子:两个不同的对象有相同的属性名和属性值,但用==和===仍不相等。因为比较的是引用,是内存地址。
存储类型:引用类型,存的是地址,值可以变,也可以添加属性和方法。
因为引用类型存的是地址,(当一个变量给另一个变量赋引用类型的值)赋值之后把原变量的引用地址赋给新变量。新变量改原来的也改变。也就是指针的赋值。任何操作会相互影响。
引用类型如果重新赋值,会在堆开辟新房间,指针指向新的堆地址。此时就不会互相影响。
最后附一下es6新增的数据类型:
symbol 和 bigInt
都是放在栈里的原始数据类型
symbol 代表创建后独一无二且不可变的数据类型,为了解决变量命名的冲突问题
bigInt 是一种数字类型的数据,标识任意精度格式的整数,安全地存储和操作大整数