JS有 Number , String , null , undefined , Boolean , Array , Object , Symbol 八种数据类型,而JS的变量,根据指向数据类型的不同,也分为两种类型,一种基本类型,一种引用类型.
基本类型
基本的数据类型有:number , string , boolean , null , undefined,Symbol 基 本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值。
值类型:变量的交换等于在一个新的地方按照连锁店的规范标准(统一店面理解为相同的变量内容)新开一个分店,这样新开的店与其它旧店互不相关、各自运营。
1.基本类型的值是不可变的
在从一个变量向另一个变量赋值基本类型时,会在该变量上创建一个新值,然后再把该值复制到为新变量分配的位置上,即基本类型在赋值操作后,两个变量是相互不受影响的。
可以看出 y 的值并不随 x 的值改变而改变,虽然把 x 赋值给了 y, 但是 y 的值是独立存在的。还有就是我们不能给基本类型添加属性和方法。
2.基本类型的比较是值的比较
这是当比较的两个值的类型不同的时候==运算符会进行类型转换,但是当两个值的类型相同的时候,即使是==也相当于是===。
3.基本类型的变量是存放在栈区的(栈区指内存里的栈内存)
上面有两个基本类型的变量,它们的存储结构如下图:
栈区包括了 变量的标识符和变量的值
引用类型
javascript中除了上面的基本类型之外就是引用类型了,也可以说是就是对象了。对象是属性和方法的集合。也就是说引用类型可以拥有属性和方法,属性又可以包含基本类型和引用类型。
引用类型:变量的交换等同于把现有一间店的钥匙(变量引用地址)复制一把给了另外一个老板,此时两个老板同时管理一间店,两个老板的行为都有可能对一间店的运营造成影响。
1.引用类型的值是可变
y只进行了一次赋值,理论上它的值已定,但后面通过改写x的值,发现y的值也发生了改变,这正是引用类型的特点。
引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响。
引用类型可以拥有属性和方法,并且是可以动态改变的。
2.引用类型的比较是引用的比较
引用类型时按引用访问的,换句话说就是比较两个对象的堆内存中的地址是否相同,那很明显,x和y在堆内存中地址是不同的。
3.引用类型的值是同时保存在栈内存和堆内存中的对象
引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,也可以说是该对象在堆内存的地址。