浅拷贝
var obj1 = { a: 1, b: 2 }
var obj2 = obj1
obj2.a = 2
console.log(obj1) //输出{ a: 2, b: 2 }
console.log(obj2) //输出{ a: 2, b: 2 }
深拷贝
//将对象序列化再解析
var obj1 = { a: 1, b: 2 }
var obj2 = JSON.parse(JSON.stringify(obj1))
obj2.a = 2
console.log(obj1) //输出{ a: 1, b: 2 }
console.log(obj2) //输出{ a: 2, b: 2 }
半深半浅
//es6扩展运算符只能克隆第一层
var obj1 = { a: 1, b: {c:1} }
var obj2 = {...obj1}
obj2.a = 2
obj2.b.c = 2
console.log(obj1) //输出{ a: 1, b: { c: 2 } }
console.log(obj2) //输出{ a: 2, b: { c: 2 } }
递归深拷贝(推荐)
//通过递归将每一层都处理一遍
function deepClone(obj) {
// 对常见的“非”值,直接返回原来值
if ([null, undefined, NaN, false].includes(obj)) return obj
if (typeof obj !== 'object' && typeof obj !== 'function') {
// 原始类型直接返回
return obj
}
const o = test.array(obj) ? [] : {}
for (const i in obj) {
if (obj.hasOwnProperty(i)) {
o[i] = typeof obj[i] === 'object' ? deepClone(obj[i]) : obj[i]
}
}
return o
}
var obj1 = { a: 1, b: {c:1} }
var obj2 = deepClone(obj1)
obj2.a = 2
obj2.b.c = 2
console.log(obj1) //输出{ a: 1, b: { c: 1 } }
console.log(obj2) //输出{ a: 2, b: { c: 2 } }
2 条评论
那如果对象中有非基础类型的字段呢
感谢提醒,已加入递归方法