JavaScript手写系列(二)(手写深浅拷贝)

43 阅读1分钟
  • 浅拷贝: 以赋值的形式拷贝引用对象, 仍指向同一个地址, 修改时原对象也会受到影响
  • 深拷贝: 完全拷贝一个新对象, 修改时原对象不再受到任何影响
    let obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        }
 //先在这里写一个对象,然后下面分别来实现深浅拷贝。

浅拷贝

    let newObj = Object.assign({}, obj)
    let newObj2 = { ...obj }    

Object.assign() 方法将所有可枚举(Object.propertyIsEnumerable()返回true(Object.hasOwnProperty()返回true)属性从一个或多个源对象复制到目标对象,返回修改后的对象。通过Object.assign() 方法可以实现浅拷贝。

深拷贝

递归深拷贝

        function deepCopy(oldObj) {
            // 过滤特殊情况
            if (oldObj === null) return null
            if (typeof oldObj !== 'object') return oldObj
            if (oldObj instanceof RegExp) {
                return new RegExp(oldObj)
            }
            if (oldObj instanceof Date) {
                return new Date(oldObj)
            }
            // 不直接创建空对象的目的: 克隆的结果和之前保持相同所属类 
            let newObj = new oldObj.constructor
            for (let k in oldObj) {
                if (oldObj.hasOwnProperty(k)) {
                    newObj[k] = deepCopy(oldObj[k])
                }
            }
            return newObj
        }
        let newObj3 = deepCopy(obj)

JSON深拷贝

    function deepClone(oldObj) {
            return JSON.parse(JSON.stringify(oldObj))
        }

JSON实现深拷贝也是比较常见的,但是这样拷贝会有一些弊端,拷贝的对象只能是Number,String,Boolean,Array,扁平对象,即那些能够被JSON直接表示的数据结构。