浅拷贝 深拷贝

19 篇文章 0 订阅
5 篇文章 0 订阅

数据类型

数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol) 和 对象数据类型

基本数据类型的特点:直接存储在栈(stack)中的数据

引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在 堆内存里

深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的

浅拷贝只复制指向某个对象的指针,新旧对象还是共享同一块内存,修改新对象会改到原对象。

直接 = (算浅拷贝)复制的是内存地址 一个修改 全部修改

其他浅拷贝 基本数据算直接赋值,复杂数据是复制的是内存地址

{name:“wn”,friend:{ age:18}} name是基本数据 修改 不会影响 , friend 为引用数据 会改到原对象

但深拷贝会赋值一个一模一样的对象,新旧对象 不共享内存,修改新对象不会改到原对象。

浅拷贝方式

= 直接赋值 复制的是内存地址 一个修改 全部修改

let a = {
    name: 'jack',
    age: 22,
    girlFriends:{
        first:  'lili',
        second: 'lisa',
        third:  'alice'
    }
}

let obj = a;

Object.assign()

let a = {
    name: 'jack',
    age: 22,
    girlFriends:{
        first:  'lili',
        second: 'lisa',
        third:  'alice'
    }
}

let obj = Object.assign({},a);
// 基本数据类型相当于深拷贝  复杂数据类型 是浅拷贝 一改同改

Array.prototype.concat()

let arr = [1,32,{name: 'jack'}];
let newArr = arr.concat();

Array.prototype.slice()

let arr = [1,32,{name: 'jack'}];
let newArr = arr.slice();

解构进行拷贝

对一维数组使用解构,进行拷贝,结果是深拷贝

let arr = [1, 2, 3];
let newArr = [...arr];

对多维数组使用解构,进行拷贝,结果是浅拷贝

let arr = [[1, 2, 3], [4, 5, 6]];
let newArr = [...arr];

深拷贝方式

JSON.parse(JSON.stringify()) – 不能处理函数

let arr = [1,2,{name:'jack'}];
let newArr = JSON.parse(JSON.stringify(arr));

手写递归

1

function deepCopy(newobj, oldobj) {
  for (var key in oldobj) {
    // 判断是否为复杂数据类型  数组    数组属于object所以在前面
    if (oldobj[key] instanceof Array) {
      newobj[key] = []
      deepCopy(newobj[key], oldobj[key])
      // 判断是否为复杂数据类型   对象
    } else if (oldobj[key] instanceof Object) {
      newobj[key] = {}
      deepCopy(newobj[key], oldobj[key])
    } else {
      newobj[key] = oldobj[key]
    }
  }
}
deepCopy({}, obj)

2

typeof [] == "object"
typeof {} == "object"
// 键值  形式 的数组[ ["0","1"],["1","2"] ]   所有转换成键值对   ""
Object.entries(["aa", "bb"])
Object.entries({ name: "andy", age: 18 })
// ========
function Copy(obj) {
  let targetObj = obj instanceof Array ? [] : {}
  for (const [k, v] of Object.entries(obj)) {
    targetObj[k] = typeof v == "object" ? Copy(v) : v
  }
  return targetObj
}

let newObj = Copy(obj)

lodash库完成深拷贝

let obj = {
            name:'老虎',
            age:'18',
            hobby:['吃肉','睡觉']
        }
        let obj2 = _.cloneDeep(obj)   //使用lodash库的方法 cloneDeep
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值