深浅拷贝

JS中的变量类型分为值类型(基本类型)和引用类型;对值类型进行复制操作会对值进行一份拷贝,而对引用类型赋值,则会进行地址的拷贝,最终两个变量指向同一份数据。

一、 浅拷贝
对象只会被克隆最外部的一层,至于更深层的对象,则依然是通过引用指向同一块堆内存.

实现

  1. 现有方法
    数组的浅拷贝:slice、concat
    对象的浅拷贝:Object.assign()
  2. 实现方法
var shallowCopy = function(obj) {
    if (typeof obj !== 'object') return;
    // 判断是新建一个数组还是对象
    var newObj = obj instanceof Array ? [] : {};
    // 遍历obj,并且判断是obj的属性才拷贝
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = obj[key];
        }
    }
    return newObj;
}

二、深拷贝
实现

  1. JSON.parse方法
JSON.parse(JSON.stringify(obj));
  1. 实现方法
var deepCopy = function(obj) {
    if (typeof obj !== 'object') return;
    var newObj = obj instanceof Array ? [] : {};
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
        }
    }
    return newObj;
}

限制:
无法实现对函数 、RegExp等特殊对象的克隆
会抛弃对象的constructor,所有的构造函数会指向Object
对象有循环引用,会报错

参考资料:
https://juejin.im/post/5abb55ee6fb9a028e33b7e0a

https://github.com/mqyqingfeng/Blog/issues/32

你可能感兴趣的:(深浅拷贝)