# 深拷贝
递归
注意: 嵌套过深会栈溢出function deepClone(obj) { let objClone = Array.isArray(obj) ? [] : {} if (obj && typeof obj === 'object') { for (let key in obj) { if (obj[key] && typeof obj[key] === 'object') { objClone[key] = deepClone(obj[key]) } else { objClone[key] = obj[key] } } } return objClone; }
1
2
3
4
5
6
7
8
9
10
11
12
13改进:
1JSON.parse 注意:
- 会忽略 undefined
- 会忽略 Symbol
- 无法序列化function,也会忽略
- 无法解决循环引用,会报错
- 深层对象转换爆栈
function deepCloneByJson(obj) { const str = JSON.stringify(obj) return JSON.parse(str); } deepCloneByJson([{a:123,name:function () {}}]) // [ { a: 123 } ]
1
2
3
4
5Object.assign() 注意:
对于Object.assign()而言,如果对象的属性值为简单类型(string,number),
通过Object.assign({},srcobj);得到的新对象为深拷贝;如果属性值为对象或其他引用类型,
那对于这个对象而言其实是浅拷贝的,这是Object.assign()特别需要注意的地方。function deepCloneByAssign(obj) { return Object.assign({},obj) } let a = {height:123,name:function () {},nice: { age: {n: "1"}}} let b = deepCloneByAssign(a) b.height = 456 //修改属性 b.nice.age = 123 //修改子类属性 console.log(b.nice === a.nice) //true console.log(b.height === a.height) //false console.log(b) // { height: 456, name: [Function: name], nice: { age: 123 } }
1
2
3
4
5
6
7
8
9
10