乐趣区

关于javascript:Javascript深拷贝发散总结

什么是 JavaScript 的深拷贝

什么是拷贝

拷贝:英文 copy 的音译,中文意思是 复制
JS 中复制通常有两种解决形式,一种是 深复制 ,一种是 浅复制

为什么 JavaScript 会辨别深拷贝和浅拷贝

依照 ECMAScript 规范,数据类型能够分为两大类,一种是 原始数据类型 ,一种是 对象(Object)

原始数据类型一共有七种:Undefined Null Number String Boolean Symbol BigInt

对象(Object): 任何能够独特 new 来创立的类型都是对象类型,例如 Map,Array,Date 等。也就是说不属于原始数据类型的都是对象

JS 在复制时,依据数据类型的不同,会体现出不同的个性。而深复制和浅复制是依据对象类型的复制后产生的不同的成果而进行的去辨别

总的来说,只有对象类型才有深复制和前复制的辨别

为什么只有对象类型才须要辨别深复制和浅复制

对于原始数据类型来说,当它复制实现时,复制的前后两个变量是两个毫无关联的数据。其外部会新建一个内存地址来寄存这两数据。

对于对象数据类型来说,当它进行浅复制时,复制实现的两个对象指向的是同一个内存地址。当进行深复制时,则会开拓出一个新的内存地址来寄存变量数据。

所以深拷贝和浅拷贝的区别,就是复制时会不会开拓一个新的内存地址来寄存对象类型

如何进行浅拷贝,浅拷贝有什么个性

1. 新建一个变量指向一个非原始数据类型的变量就曾经实现浅拷贝

2. 个性:因为两个变量指向的是同一个内存地址,都是指向同一个对象,所以当任意一个拷贝对数据进行批改时,所有拷贝变量中的值都会发生变化

如何进行深拷贝,深拷贝有什么个性

办法:

  1. 应用 JSON.parse()和 JSON.stringify()对对象进行拷贝
  2. 构建函数进行深拷贝

个性:深拷贝会开拓一个新的内存地址存储独自存储拷贝进去的值,所以拷贝前后的两个对象并无关联,当对其中一个变量进行批改时,并不会影响另一个变量

深拷贝的两种办法有什么不同

办法一:

  1. JSON.parse(JSON.stringify(obj)) 能够简略的实现对对象的深拷贝,
  2. 当须要拷贝的对象 obj 中的值 不属于原始数据类型时,无奈很好的拷贝 ,不反对拷贝 undefined、function、Date 等, 只能实现原始数据类型的深拷贝

办法二:
依据拷贝的须要,应用 typeof instanceof 和递归,构造函数进行拷贝

function deepClone(obj) {
    // 返回 null 类型
    if (obj === null) return null
    //typeof 的 null 和 object 都会返回 object,第一步曾经排除了 为 null 的状况,剩下的就是不须要解决的数据类型
    if(typeof obj !== 'object') return obj
    
    if(obj instanceof Date) return new Date(obj)

    if(obj instanceof RegExp) return new RegExp(obj)
    const cloneObj = new obj.constructor();  // 放弃继承链
    for(const key in obj) {if(obj.hasOwnProperty(key)) {cloneObj[key] = obj[key]
        }
    }
    return cloneObj
}

深拷贝思考发散出几个问题
1. 什么是内存地址
2.JSON.stringify 和 JSON.parse()
3.typeof instanceof
4. 递归

退出移动版