php 数组 深拷贝,JS数组和对象的浅拷贝和深拷贝教程讲解

共勉~

在许多编程语言中,传递参数和赋值是通过值的直接复制或者引用复制完成的。在JavaScript中,对于值是直接进行复制还是引用复制在语法上是没有区别的,完全是根据值的类型来决定的。

在JavaScript中,简单值总是通过值的直接复制来进行赋值传递的(null,undefined,字符串,数字,布尔,symbol),而复合值(对象(包括数组等)和函数)总是通过引用复制的方式来进行赋值和传递的。

下面的例子能加深理解:

var a = 1;var b = a;

b++;

a; //1b; //2var c = [1,2];var d = c;

d.push(3);

c; //[1,2,3]d; //[1,2,3]

数组的浅拷贝

上面例子对于数组的赋值操作就是数组的浅拷贝,不难发现问题当一个数组改变的时候,其他赋值的数组也会改变,在很多类似备份的情况中,这并不是我们想要的结果。

var c = [1,2];var d = c;

d.push(3);

c; //[1,2,3]d; //[1,2,3]

数组的深拷贝

我们可以通过两种方法来实现数组的深拷贝:

var a = [1,2,3];var b = a.slice(0);var c = a.concat();

b.push(4);

c.push(5);

a; //[1,2,3]b; //[1,2,3,4]c; //[1,2,3,5]

对象的浅拷贝

相对来说数组的拷贝比较简单,而对象的浅拷贝我们也可以简单实现:

function easyClone(Obj) {var objNew = {};for ( var i in Obj) {

objNew[i] = Obj[i];

}return objNew;

}

其实就是将每个原对象的属性和值复制到新对象上去,当然我们也可以使用Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象,同时Object.assign() 也是浅拷贝,有兴趣的同学可以看看。

浅拷贝因为没有递归循环检查对象的每个值是否是对象,而是直接进行了赋值,所以如果某个值是对象的时候就会出现问题,所以在一般情况下我们需要用深拷贝来进行备份。

对象的深拷贝

最简单的深拷贝:

b = JSON.parse( JSON.stringify(a) )

局限性:无法复制函数

原型链没了,对象就是object,所属的类没了。

其实简单的深拷贝只需要我们递归调用浅拷贝就可以了:

function deepCopy(obj) {

var objNew = objNew || {};

for (var i in obj) {

if (typeof p[i] === 'object') {

objNew[i] = (p[i].constructor === Array) ? [] : {};

deepCopy(obj[i], objNew[i]);

} else {

objNew[i] = obj[i];

}

}

return objNew;

}

当然JQ的jQuery.extend()方法也可以做到深拷贝和浅拷贝:详情可以参考这篇文章:

浅拷贝深拷贝之jQuery中的$.extend分析

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值