1、基本数据类型拷贝
基本数据类型的拷贝就是通过一个变量赋值给另一个变量的操作
let a = 1;
let b = a;
把a赋值给b之后,再去操作a并不会影响b,因为a和b是两个不同的区域
let a = 1;
let b = a;
a = 5;
console.log(b); //输出1
console.log(a); //输出5
2、浅拷贝(shallow clone)
浅拷贝只能拷贝复杂数据类型的指针,并不能改变复杂数据类型的地址,只能拷贝外层,并不能彻底拷贝,例如数组中还有数组(对象),(准确来说是外层引用数据类型)
(1)对象浅拷贝
①依次赋值
优点:数量较少的时候使用方便、简单
缺点:遇到对象或者数组比较多的,操作不方便
let obj = {
a: {name: '涛哥'},
b: 2
}
let newObj = {}
newObj.a=obj.a
newObj.b=obj.b
console.log(newObj);
console.log(obj);
输出结果:
②for...in 遍历
let obj = {
b: 2,
a:1
}
let newObj = {}
for (const key in obj) {
newObj[key]=obj[key]
}
obj.b = 1
console.log(newObj);
遍历obj对象中的每一项,赋值给newObj对象
③Object.assign(目标对象,要拷贝的对象)
let obj = {
b:2
}
let newObj= {}
// 拷贝给谁 , 拷贝对象
Object.assign(newObj,obj)
obj.b = 5
console.log(newObj);
console.log(obj.b);
console.log(newObj.b);
输出:
注: 浅拷贝只能拷贝一层 不能继续拷贝里面的复杂数据类型
3、深拷贝
不光外层的引用地址该变了 内层的引用数据类型也发生改变
let obj = {
b:2,
hobby:{
jump:'卷' //hobby是一个对象
}
}
let newObj= {}
Object.assign(newObj,obj)
console.log(newObj);
obj.b = 99999 //修改obj里边的b元素的值,newObj中的b元素的值不会改变
obj.hobby.jump='卷不懂了' //obj里边的hobby对象赋值'卷不懂了'
console.log(obj,newObj);
输出:
(2)JSON.parse(JSON.stringify()) 深拷贝
let obj = {
b: 2,
hobby: {
jump: '跳'
}
}
let obj4 = JSON.parse(JSON.stringify(obj)) // 深拷贝
console.log(obj4);
输出:
了解:
JSON.parse(JSON.stringify())拷贝后的缺陷:
- NaN ===》null
- undefined ===》 空
- 时间戳 ===》字符串时间
- 错误信息 ===》 空对象
- Infinity ===》null