js克隆

// 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝

// 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、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);

但是以上方法是数组里面含有简单的数据的时候;如果数组里面元素也为引用类

型的时候,则会因为值是按照引用类型复制的,克隆对象修改的时候,会修改原

对象的值,所以要对原对象的元素做循环,并判断数据类型,直到是基本类型为

止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值