深浅拷贝的实现

浅拷贝

  • 利用扩展运算符进行浅层拷贝
function easyCopy(obj) {
    return {...obj}
}
1
2
3
  • 利用Object.assign()进行浅层拷贝
function easyCopy(obj) {
    return Object.assign({},obj)
}
1
2
3
  • 小结:浅拷贝只能进行第一层数据的拷贝,如果对象存在嵌套情况,则浅拷贝失效。

深拷贝

  • 利用JSON.parse和JSON.stringify进行深层拷贝
function deepCopy(obj) {
    return JSON.parse(JSON.stringify(obj))
}
// 上述方式确实能够实现深层拷贝,但是当深层的对象值为函数,undefined,null时,则无法解析。
1
2
3
4
  • 通过循环对数据进行逐一拷贝,如果子属性仍未对象,则可通过递归的方式向下传递。
function deepCopy(obj) {
   if(typeof obj !== 'object' || obj === null) return
   let newObj = Array.isArray(obj) ? [] : {}

    for (const key in obj) {
        if(typeof obj[key] === 'object'){
            newObj[key] = deepCopy(obj[key])
        }else {
            newObj[key] = obj[key]
        }
    }
    return newObj
}
1
2
3
4
5
6
7
8
9
10
11
12
13
function deepCopy(obj) {
    // 判断对象类型
   function isObject(value) {
       return (typeof value === 'object' || typeof value === 'function') && value !== null
   }
   // 判断数组类型
   function isArray(arr) {
       return Array.isArray(arr)
   }
   if(!isObject(obj)) throw new Error('not a object')
   let newObj = isArray(obj) ? [...obj]:{...obj}
   
   Reflect.ownKeys(newObj).forEach(key=>{
       newObj[key] = isObject(obj[key]) ? deepCopy(obj[key]) : obj[key]
   })
   return newObj
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
上次更新: 9/25/2019, 9:54:29 AM