javascript中的clone

clone

克隆分为浅度和深度两种

浅度克隆

源对象中有什么属性,目标对象中就会有什么属性,但是当我们又一个属性是引用值(数组或对象)的时候,浅度客隆只是把这个引用值的指向赋给了新的对象,所以就存在这样一个缺点:一旦我们改变了源对象或者目标对象的引用值属性,另一个也会跟着改变。
下面简单举一个浅度克隆的例子

function clone( origin, target)
{
var target = target|| {};

//写这个代码的作用是,如果用户不输入target,那么就自动生成一个对象

for(var prop in origin)
{
target[prop]=origin[prop];
}
}

上述代码中还存在一个知识点,就是for in 遍历,但是用for in遍历对象属性的时候,原型链上的所有属性都会被访问,所以我们要加上obj.hasOwnProperty判断是不是自己的属性,下面po一段for in使用的常规代码

var obj= {
name:" Della",
age:20,
sex:"female",
height:163,
weight:49,
__proto__:{lastname:"Bai"}
// 关于函数原型链的问题在这里不赘述,其他博客中会有介绍
};
if( obj.hasOwnProperty(prop))
//记得先判断是不是自己的属性
forvar prop in obj)
//注意这种写法,for后面的内容都在括号里 
//不要忘记写定义变量var 什么什么
{
console.log(obj.prop);
}

所以给浅度客隆的示例代码中加上判断更好

function clone( origin, target)
{
var target = target|| {};
if(origin.hasOwnProperty(prop))
{
for(var prop in origin)
{
target[prop]=origin[prop];
}
}
}

深度克隆

为了解决碰到引用时的问题,我们采用这样一种思路来完成深度拷贝

  1. 遍历对象 for(var prop in obj)
  2. 判断是不是原始值 type of (),看是不是object
  3. 判断是数组还是对象,看看是[ ]y还是{ }
  4. 递归,引用里还有引用就继续
//深度克隆
function deepClone( origin,target)
{
var target=target||{};
//这里和上面一样,为了防止用户不输入target
}
//然后遍历对象
if(origin.hasOwnPropoerty(prop))
{
for( var prop in origin)
{
//判断是不是原始值,
}
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值