1. JSON.stringify()以及JSON.parse()
但是这种方法是不可以拷贝 undefined , function, RegExp 等等类型的
var obj5 = {
a: 1,
b: 2,
c: 3
}
var objString = JSON.stringify(obj5);
var obj6 = JSON.parse(objString);
obj5.a = 5;
console.log(obj5.a); // 5
console.log(obj6.a) //1
2. 递归拷贝
这种方法可以拷贝function,但是不可以拷贝 undefined , RegExp 等类型的
/**
* 引用类型拷贝的规则是浅拷贝
* 要实现一个深拷贝
*/
const obj1 = {
age: 20,
name: '王明洁',
address: {
city: '杭州'
},
arr: ['a', 'b', 'c']
}
const obj2 = deepClone(obj1)
obj1.address.city = '上海'
console.log(obj2.address.city) //杭州
/**console.log(obj2.address.city)
* 深拷贝
* @param {Object} obj 要拷贝的对象
*/
function deepClone(obj={}){
/* 1.判断是基本类型还是引用类型 */
/* 如果不是对象和数组,或者为null,没有必要做深拷贝,直接返回 */
if(typeof obj !== 'object' || obj == null) {
return obj
}
/* 判断是数组还是对象 */
/* 初始化返回结果,如果obj是数组,则返回数组格式,如果obj是对象,则返回对象格式 */
let result
if(obj instanceof Array) {
result = []
} else {
result = {}
}
/* 递归 */
/* 返回结果 */
for(let key in obj) {
/* 判断一下key是不是obj自己拥有的属性,保证key不是原型的属性 */
if(obj.hasOwnProperty(key)) {
//递归调用
result[key] = deepClone(obj[key])
}
}
return result
}
注意: Object.assign(target, source)不是深拷贝
这种方法对于一层对象来说是没有问题的,但是如果对象的属性对应的还是对象或者数组时,就不能实现了
var obj5 = {
a: 1,
b: ['a', 'b'],
c: {x: 100, y: 200}
}
var obj6 = Object.assign({}, obj5)
obj5.a = 5;
obj5.b[1] = 'c'
obj5.c.x = 900
console.log(obj5.a); // 5
console.log(obj6.a) //1
console.log(obj5.b[1]) //c
console.log(obj6.b[1]) //c
console.log(obj5.c.x) //900
console.log(obj6.c.x) //900