js 深拷贝

第一种方法 JSON.parse(JSON.stringify())
局限是无法克隆Function,undefined,null类型的
 1 let obj1= {
 2         name:'Chandler Wong! ',
 3         feature:{
 4             hobby:['jazz','dance','guitar','football'],
 5             language: ['Chinese','English','Spanish'],
 6             explain:function (){
 7                 let initData = 'I like '
 8                 this.hobby.forEach(item => {
 9                     initData += item + ','
10                 })
11                 this.language.forEach((item,index) => {
12                     if(index < this.language.length - 1) {
13                         initData += item+','
14                     }else {
15                         initData+='and '+ item + '.'
16                     }
17 
18                 })
19                 return initData
20             },
21             other:{
22                 liveCity:{
23                     residence1: 'HuangGang',
24                     residence2:'WuHan',
25                     address: 'BeiJing'
26                 }
27             }
28         },
29         major:['computer science','history'],
30         introduce:function (){
31             return 'Hello everybody,my name is '+this.name+this.feature.explain()
32         },
33         otherParam:[undefined,null,[],{},0,1,true,false]
34     }
35   // 第一种方法 JSON.parse(JSON.stringify())
36     const obj2=JSON.parse(JSON.stringify(obj1))
37     // JSON.parse(JSON.stringify())的局限是无法克隆类型为Function,undefined,null
38     console.log('【第一种方法 JSON.parse(JSON.stringify())】')
39     console.log('获取feature里边的explain方法',obj1.feature.explain())
40     console.log('获取introduce方法',obj1.introduce())
41     console.log('这是obj1',obj1)
42     console.log('这是拷贝自obj1的obj2',obj2)

 第二方法,递归

 1 function deepClone(sourceObj){
 2         if(!sourceObj && typeof sourceObj != 'object') {
 3             throw new Error('This is not object or sourceObj is empty!')
 4         }
 5         const targetObj = sourceObj.constructor === Array ? [] : {}
 6         Object.keys(sourceObj).forEach(item => {
 7             if(sourceObj[item] && typeof sourceObj[item] === 'object'){
 8                 targetObj[item] = deepClone(sourceObj[item])
 9             }else {
10                 targetObj[item] = sourceObj[item]
11             }
12         })
13         return targetObj
14     }
15    const obj3 = deepClone(obj1)
16     console.log('这是deepClone',obj3)

原文地址:https://www.cnblogs.com/chandlerwong/p/15022032.html