数组对象拷贝的几种方法

赋值,浅拷贝,深拷贝的区别

JS数据类型

基本数据类型:数值,字符串,布尔,undefined ,null,symbol这种

引用数据类型:数组,对象

赋值

数组对象的赋值是有影响的,改新的数组和新的对象,老的数据也会发生变化。对于基本数据类型,改变新的对于老的数据是没有影响的。

//对象进行赋值改变新的对象的值
let a={name:'xue',age:[1,2,3,4]}
let aa=a
aa.name='jun'
console.log(aa,a);
//{name: 'jun', age: Array(4)} {name: 'jun', age: Array(4)}
//对于对象进行赋值,新对象变化,老的也变化

浅拷贝

个人的理解浅复制就是复制该对象的的每个属性,如果该属性值是原始值,则复制该原始值,如果属性值是一个对象,那么就复制该对象的引用。

就是如果第一层是基本数据类型,则新数据改变,不会改变老数据的基本数据。引用数据类型变化会影响老的数据变化。

let arr=[1,2,3,[12,34,56]]
let arrclon//浅克隆
//浅克隆第一层里面的基本数据类型不互通,引用数据类型互通

 实行浅克隆的方式

Object.assign()是可以实现对象的浅克隆

扩展运算符(...)

let arr={a:1{b:2}}
let arrclon=Object.assign()
let arrr={...arr}
//arrclon的浅克隆

浅克隆的手动实现 

function shallowClone(source) {
    // 如果是原始值,直接返回
    if (typeof source !== 'object') {
        return source;
    }

    // 拷贝后的对象
    const copied = Array.isArray(source) ? [] : {};
    
    // 遍历对象的key
    for(let key in source) {
        // 如果key是对象的自有属性
        if(source.hasOwnProperty(key)) {
            // 复制属性
            copied[key] = source[key]
        }
    }
    
    // 返回拷贝后的对象
    return copied;
}

 Object.hasOwnProperty() 返回 true   这个用来判断是否,来复制数据。

深拷贝

JSON.parse()和JSON.stringify()

原生js书写

function deepClone(source) {
    // 如果是原始值,直接返回
    if (typeof source !== 'object') {
        return source;
    }

    // 拷贝后的对象
    const copied = Array.isArray(source) ? [] : {};
    
    // 遍历对象的key
    for(let key in source) {
        // 如果key是对象的自有属性
        if(source.hasOwnProperty(key)) {
            // 深复制
            copied[key] = deepClone(source[key]);
        }
    }

    return copied;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值