1.基本数据类型和引用数据类型:
①基本数据类型:(7种)Undefined、Null、Boolean、Number、String、Symbol、BigInt。
这些类型保存在变量中的值就是实际值,放在栈内存中,按值访问。
②引用数据类型:Object(对象)。
值放在堆内存中,按引用访问,操作的是对象的引用,而不是真正的对象。
2.复制基本数据类型和引用类型的值的区别:
①复制基本数据类型:a和b是相互独立的,改变彼此的值不会相互影响。复制的是真正的值。
var a = 0; var b = 1; a = b b = 2 console.log(a) // 1 console.log(b) // 2
②复制引用类型的值:a和b相互影响,改变一个变量的值,另一个也会跟着改变。因为复制的时候复制的是指针,而不是真正的值。
var a = { name: '小红', age: 18 } var b = a // { name: '小红', age: 18 } a.age = 16 console.log(a) // { name: '小红', age: 16 } console.log(b) // { name: '小红', age: 16 }
3.浅拷贝:(引用类型)复制的是指针
①直接使用“=”符号复制,这样复制的就是指针,改变其中的一个,另一个也会跟着变。
②Object.assign():
当复制的对象只有一层结构时,相当于深拷贝(彼此没有联系)。
var a = { name: '小红', age: 18 } var b = Object.assign({}, a) // { name: '小红', age: 18 } b.age = 16 console.log(a) // { name: '小红', age: 18 } console.log(b) // { name: '小红', age: 16 }
当复制的对象有多层结构时,第一层为深拷贝(彼此没有联系),从第二层开始为浅拷贝(改变其中的一个,另一个也会跟着改变)
var a = { name: '小红', age: 18, friend: { one: '看书' } } var b = Object.assign({}, a) b.age = 16 // { name: '小红', age: 16, friend: { one: '看书' }} b.friend.one = '听歌' // { name: '小红', age: 16, friend: { one: '听歌' }} a.friend.one = '做饭' // { name: '小红', age: 18, friend: { one: '做饭' }} console.log(a) // { name: '小红', age: 18, friend: { one: '做饭' }} console.log(b) // { name: '小红', age: 16, friend: { one: '做饭' }}
③解构赋值同理。
4.深拷贝:(引用类型)复制的是数据的值,彼此不影响
JSON.parse(JSON.stringify()):
var a = { name: '小红', age: 18, friend: { one: '看书' } } var b = Object.assign({}, a) b.age = 16 // { name: '小红', age: 16, friend: { one: '看书' }} b.friend.one = '听歌' // { name: '小红', age: 16, friend: { one: '听歌' }} a.friend.one = '做饭' // { name: '小红', age: 18, friend: { one: '做饭' }} console.log(a) // { name: '小红', age: 18, friend: { one: '做饭' }} console.log(b) // { name: '小红', age: 16, friend: { one: '听歌' }}