手写深拷贝
手写深拷贝
JavaScript的数据类型
-
基本数据类型
- String
- Number
- Boolean
- Null
- undefined
- Symbol
-
引用数据类型
- Object
- array
- function
- date
深、浅拷贝
在JavaScript中,基本数据类型的值是直接存储在栈内存中的,在用变量对另一个变量赋值时,是在变量对象上创建一个新值并分配给新的对象。
而引用数据类型只是在栈中存储了一个指向堆内存引用,这个引用的指向才是真正的数据值。而使用引用数据类型的变量a
给b
赋值,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;
}