slice(0)和深拷贝区别

slice(0)和深拷贝有什么区别呢?

举个栗子:

var obj = [
    {
        name:'melin1',
        job:'111'
    },
    {
        name:'melin2',
        job:'222'
    },
    {
        name:'melin3',
        job:'333'
    }
];
var copy = obj.slice(0);
copy[1].name = 'tom';
console.log(obj[1].name); //tom
console.log(copy[1].name); //tom

结果是obj[1].name和copy[1].name都被修改了。slice可看作浅拷贝,因为如果obj有引用类型的元素,slice仅仅是复制了元素的地址。

  • (1)拷贝是指得到被拷贝对象的副本,副本的修改不会影响到原对象;

  • (2)js的传参是按值传递,但是对于引用类型,传递的值是原对象在内存中的地址,所以拷贝仅仅是获取了原对象的引用;

  • (3)在 (2) 的基础上,对拷贝进行修改,原对象也会被修改;

  • (4)要想避免(3)的情况出现,就不能仅仅拷贝地址,而是要将原对象的属性树遍历复制到拷贝上,这样拷贝和原对象就是完全独立的了;

  • (5)(4)的情况叫深拷贝,与之相对, (2) 的情况叫浅拷贝;

  • (6)如果obj所有值都是非引用类型,那么obj.slice(0)与深浅拷贝没有差别;

  • (7)如果obj有引用类型的元素的话,obj.slice(0)仅仅是复制了元素的地址,,obj.slice(0)可看作浅拷贝。

转载于:https://www.cnblogs.com/xmyun/p/8117567.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值