javaScript 深克隆和浅克隆
前言
当我们需要操作一个javaScript对象,但不希望改变原对象时,就需要对对象进行克隆
一、一些要点
为什么不能直接用" = "赋值来克隆,比如:var obj1 = obj,这就得了解javaScript的数据类型了。
举例 | 用 = 传值时 | 用 == 比较时 | |
---|---|---|---|
基本类型 | number、字符串、boolean、undefined、null、symbol | 内存中产生新的副本 | 比较值是否相等 |
引用类型 | 对象、数组、函数 | 内存中不产生新的副本,而是让新变量指向同一个对象 | 比较内存地址是否相同,即比较是否为同一对象 |
所以,当对对象用 = 赋值时,其实只是引用它的地址,还是对原来的对象进行操作。
二、浅克隆
基本类型直接克隆,引用类型引用原来的地址。
克隆方法:使用for…in…循环,遍历属性,赋值克隆。
var obj1 = {
a:1;
b:2;
c:[1,2,3]
};
var obj2 = {};
for(var o in obj1){
obj2[o] = obj1[o];
};
三、深克隆
基本类型和引用类型都克隆,使用递归,判断类型。
function clone(obj){
// 必须先判断是否为数组,因为数组也是对象
if(Array.isArray(obj)){
var result = [];
for(var i = 0;i < obj.length;i++){
result.push(clone(obj[i]));
}
}else if(typeof obj == 'object'){
var result = {};
for(var k in obj){
result[k] = clone(obj[k]);
}
}else{
var result = obj;
}
return result;
}
结语
理解有误的话,希望大家及时指出。