深拷贝与浅拷贝

本文深入探讨了JavaScript中的对象拷贝和合并,包括使用`Object.assign()`、扩展运算符以及自定义浅拷贝和深拷贝实现。同时提到了`JSON.parse(JSON.stringify())`方法的深拷贝限制,以及在Vue中使用lodash库进行深拷贝的方法。这些技巧对于理解和优化JavaScript代码中的数据操作至关重要。
摘要由CSDN通过智能技术生成
const obj1 = {name:'lili',age:18}
const obj2 = {name:'xiaoming',say}
const obj3 = {name:'xiaohua',sex:'nv',child:[obj1,obj2]}

1.Object.assign():用于合并对象本身可枚举的属性,合并至第一个对象上,并返回此目标对象,浅拷贝

const result1 = Object.assign(obj1,obj2,obj3)//合并对象
const result1 = Object.assign({},obj3)//浅拷贝对象

2.扩展运算符,属于浅拷贝

const result2 = {...obj1,...obj2,...obj3}

3.实现浅拷贝

const checkedType = (target) => {
  return Object.prototype.toString.call(target).slice(8, -1);
}
const shallowclone=(target)=>{
  console.log(target)
  let result;
  if(checkedType(target)=="Array"){
      result=[];
  }else if(checkedType(target)=="Object"){
      result={};
  }
  // for..in 遍历数组或者对象的可枚举的key(包含继承的属性);hasOwnProperty判断是否为对象自身可枚举属性
  // Object.keys:获取到对象可枚举的所有私有属性,返回数组
  for(let key in target){
    if(target.hasOwnProperty(key)){
        result[key]=target[key];
    }
  }
  return result;
}

4.实现深拷贝

const checkedType = (target) => {
  return Object.prototype.toString.call(target).slice(8, -1);
}
const deepClone = (target) => {
  let result;
  if(checkedType(target)==="Array"){
    result = []
  }else if(checkedType(target) ==="Object"){
    result = {}
  }
  for (let key in target){
    if(target.hasOwnProperty(key)){
      if(checkedType(target[key])==='Array'||target[key]==='Object'){
        //判断当键值属于数组或对象,递归的拷贝
        result[key] = deepClone(target[key])
      }else{
        result[key]=target[key];
      }
      
    }
  }
  return result
}

5.Json.parse(Json.stringify())实现深拷贝

注意:不能拷贝函数,undefined,NaN,

6.vue中lodash库实现深拷贝

使用:
1)npm i --save lodash
2)import _ from ‘lodash’;
3)_.cloneDeep(obj3)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值