值类型和引用类型的区别
-
在js中变量分为两种:值类型(基本数据类型)和引用类型
-
值类型:string、number、boolean、null、undefined和symbol类型
-
引用类型:Object(对象)、Array(数组)和Function(函数)
-
-
值类型和引用类型的区别:
-
变量的存储方式不同:
当我们声明一个变量的时候,变量是以key-value的方式储存在内存中的,内存又有栈内存和堆内存。
值类型和引用类型在内存中的储存方式是不一样的,值类型的变量储存在栈内存中,key储存的是变量的名称,value储存的是变量的值,例如声明变量 let a = 100,它在栈内存中是这样存放的:
-
而引用类型变量的储存方式就比值类型的复杂一些了,例如当声明一个对象类型的变量的时候,javascript虚拟机会在栈内存和堆内存中都开辟一块空间,把变量的值存放到堆内存中,变量名称存放到栈内存的key中,栈内存中的value存放的是内存地址,这个内存地址指向堆内存存放对象内容的地址。
2. 拷贝方式不同:
值类型在拷贝的时候拷贝的是变量的值,新变量和原来的变量之间是独立的,互不干扰。
而引用类型是浅拷贝,拷贝的是引用地址,所以新变量和原来的变量指向的是同一个对象,当其中的一个变量修改了对象的内容时,另一个变量也会发生改变。‘
-
比较方式不同:
值类型的比较是值的比较,当比较它们的值相等时,就是相等,比较时注意 == 和 ===,使用 == 进行比较时做了类型转换, 当变量的值相等时就视为相等,而使用 === (全等)进行比较时,会比较值和类型是否都相等,只有在值和类型都相等时才是相等。
引用类型比较的是引用地址,即使两个对象的属性和值一模一样,它们也不一定相等。