手写篇—— deepClone续

23 阅读1分钟

一看就会的deepClone 深拷贝(Deep Copy)是指创建一个新的对象,该对象的内容与原始对象完全相同,但是在内存中的位置不同。深拷贝会递归地复制所有的嵌套对象,而不仅仅是复制引用。这意味着即使原始对象包含其他对象作为成员变量,深拷贝也会为这些对象创建独立的副本。

深拷贝的目的是在修改新创建的对象时不会影响原始对象。它通常用于需要保留原始数据的同时进行修改或独立操作的情况。

简易版

 function deepCloneSimple(obj) {
                  if (typeof obj !== 'object' || obj === null) {
                        return obj
                  }

                  let result
                  if (obj instanceof Array) {
                        result = []
                  } else {
                        result = {}
                  }
                  for (let key in obj) {
                        if (hasOwnProperty) {
                              result[key] = deepCloneSimple(obj[key])
                        }
                  }
                  return result

            }
            //测试代码

            const obj = {
                  name: 'pp',
                  age: 18,
                  friend: {
                        one: '1'
                  }

            }
            console.log(obj)

            const obj2 = deepCloneSimple(obj)
            obj2.friend.one = 2
            console.log(obj2)

image.png

image.png

进阶版:

  <script>
        function isObject(value) {
            const valueType = typeof value
            return (value !== null && (valueType === 'object' || valueType === 'function'))
        }
        //深拷贝是一个递归函数/生成器也是递归函数--也是特殊的迭代器
        //Symbol.iterator函数,调用的时候会返回一个iterator ,next方法属性 done/value属性
        function deepCopy (item) {
            //symbol是value的情况,直接返回这个Symbol,根据item的description创建一个新的symbol对象
            if(typeof item === 'symbol'){
                return Symbol(item.description)
            }
            //普通的类型
            if (!isObject(item)){
                return item
            }
            //函数不需要深拷贝
            if (typeof item === 'function') {
                return item
            }
            //set类型
            if (item instanceof Set) {
                const newSet = new Set()
                for ( const setItem of item ) {
                    newSet.add(deepCopy(setItem))
                }
                return newSet
            }
          //judge whether it is an array
            const newObject = Array.isArray(item) ? [] : {}
            for (const key in item) {
                  //递归调用deepCopy
                newObject[key] = deepCopy(item[key])
            }
            //遍历symbol的key
            const symbolKeys = Object.getOwnPropertySymbols(item)
            for (const symbolKey of symbolKeys) {
                newObject[Symbol(symbolKey.description)] = deepCopy(item[symbolKey])
            }
            return newObject    
        }
        //iterable object 无法copy
        const info = {
            name: 'abc',
            friend: {
                name:'yy',
                age: '29',
                nickName: {
                    name:'pp',
                    address:'chongqing'
                }
            },
            set: new Set(['1','2','3']),
            symbolKey: Symbol('xxxx'),
            [Symbol('y')]: Symbol('p')
        }

        s1 = Symbol('aaa')
        s2 = Symbol('aaa')
        s3 = Symbol(s2.description)
        console.log(s3)
        console.log(s2===s3)
        console.log([s3])

        console.log(s1 === s2)

        //for in 对象是key   []是索引  
        //for of 可迭代对象拿到的是 value
        //【】 string arguments Sets Map  
        console.log(deepCopy(info))

    </script>