// 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝// 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、Object对象。不会包含函数、正则对象等
深度克隆是指完整的复制,包括属性和方法,且复制的对象的值的改变不会影响到原来的对象。
首先需要了解基本的数据类型和引用类型有哪些:
第一、基本的数据类型有:String、boolean、number、null、undefined、object.
第二、引用类型:Object、Array、data、RegExg、Function。
第三、区别:
1)保存方式不同:基本类型值是简单的数据段,是按值访问的,可以保存在变量中。引用类型是多个值构成的对象,也被称为
合成类型,它的值是保存在内存中的对象,js不允许直接访问内存中的位置,是按照引用访问的;原始类型存放的是实际数据,
引用类型存放的是对象的引用地址,实际数据另外存放,为减少开销通常存放在内存中。对象的原型也是引用对象,它把原型的方法和属性放在内存当中,通过原型链的方式来指向这个内存地址。
2)基本类型的值不能添加属性,引用类型的值可以被添加属性和方法;
3)复制变量值时不同:
1、基本类型值可以直接用复制(该复制是副本,相互之间独立):
例如:var num1=1;
var num2 = num1;
num2 = 2;
// num1 = 1;
这时num2的值不会影响到num1的值。
其他的boolean、string、null、undefined都是一样的。
2、从一个变量向另一个变量复制引用类型的值时,也会将原对象中的值复制到新的对象的内存中,但是这个值的副本实际上是一
个指针,指向存储在堆中的一个对象。复制结束时,两个对象引用的是一个对象。改变其中一个变量,则会影响到另外一个变量。
所以直接复制,不能算是深度克隆。
3、引用类型中的Function是一个特例,它的参数的传递是按照值来传递的。复制function和基本类型值的复制一样。
4、数组的克隆:
如果数组是一个简单的数组,数组的元素里面没有引用类型的值,可以这样克隆:
(1)、利用for循环,遍历第一个数组的元素,赋值给克隆对象:
比如:
function deepClone(arr){ var arr1 = []; for(var i = 0;i<arr.length;i++){ arr1[i] = arr[i]; } return arr1; } var x = [3,4,5]; var y = deepClone(x); console.log(y);
(2)对原数组采用slice()方法,其操作后得到的新数组不影响原数组的操作;
function deepClone(arr){
return arr.slice(0);
}
var x = [3,4,5];
var y = deepClone(x);(3)采用数组的concat方法,用一个空数组和原数组contact得到一个新数组;
function deepClone(arr) { var arr1 = []; var arr2 = []; arr2 = arr1.concat(arr); return arr2; } var arr = [1,2,3]; var result = deepClone(arr); console.log(result); result.push(4,5); console.log(arr); console.log(result);
但是以上方法是数组里面含有简单的数据的时候;如果数组里面元素也为引用类
型的时候,则会因为值是按照引用类型复制的,克隆对象修改的时候,会修改原
对象的值,所以要对原对象的元素做循环,并判断数据类型,直到是基本类型为
止。
js克隆
最新推荐文章于 2024-08-15 10:20:11 发布