手写深拷贝

手写深拷贝

JavaScript的数据类型

  • 基本数据类型

    1. String
    2. Number
    3. Boolean
    4. Null
    5. undefined
    6. Symbol
  • 引用数据类型

    1. Object
    2. array
    3. function
    4. date

深、浅拷贝

在JavaScript中,基本数据类型的值是直接存储在栈内存中的,在用变量对另一个变量赋值时,是在变量对象上创建一个新值并分配给新的对象。

而引用数据类型只是在栈中存储了一个指向堆内存引用,这个引用的指向才是真正的数据值。而使用引用数据类型的变量ab赋值,b得到的只是一个引用,当修改b的值时,b指向的值发生改变,导致a的值也发生改变。

// 基本数据类型
var a = 10;
var b = a;
a = 5;
console.log(a, b);	// 5	10

// 引用数据类型
var obj1 = {
    name: '张三',
    age: 18
};
var obj2 = obj1;
obj1.name = '李四';
console.log(obj1, obj2);	// {name: "李四", age: 18}	{name: "李四", age: 18}

手写深拷贝

思路

引用数据类型的变量可以包括其他引用数据类型的变量,所以要遍历变量的每一个属性,当属性是引用数据类型时进行更深层次的遍历,直到所有属性都为基本数据类型,再进行赋值。

代码实现

function deepClone(obj) {
    // 当数据类型为基本数据类型时,返回值
    if (typeof obj !== 'object' || obj == null) {
        return obj;
    }

    let result;

    if (obj instanceof Array) {
        // 数组
        result = [];
    } else {
        // 对象
        result = {};
    }

    // 遍历obj的所有属性
    for (let key in obj) {
        // 创建对象属性进行赋值
        result[key] = deepClone(obj[key]);
    }

    return result;
}
posted @ 2021-06-07 22:00  陈嘉懿  阅读(87)  评论(0编辑  收藏  举报