深拷贝和浅拷贝的区别?如何实现?

JavaScript中存在两大数据类型

  • 基本数据类型 (String,Number,Boolean,Undefined,Nll,Symbol)

  • 引用数据类型 (Object,Array,Function)

浅拷贝

浅拷贝拷贝的是外层,内层拷贝的是内存地址

如果属性是基本数据类型,拷贝的就是基本数据类型的值,如果是引用数据类型,拷贝的就是内存地址

浅拷贝的实现方式

  1. for in 循环,赋值

    let obj = {
        name:'张三',
        age:18,
        msg:{
            say:'hello'
        }
    }
    ​
    let newObj = {}
    ​
    for(var k in obj) {
        newObj[k] = obj[k]
    }

  2. Object.assign

    var newObj = Object.assign({},obj)

  3. slice() 浅拷贝数组

    var arr = [1,2,3,4]
    var newArr = arr.slice(0)

  4. concat() 数组合并

    var newArr = arr.concat()

  5. 扩展运算符

    var newArr = [...arr]

深拷贝

深拷贝开辟了一个新的栈,两个对象的属性完全相同,但是他们对应的引用地址不同,改变一个对象的属性,不会影响另一个对象的属性

深拷贝的实现方式

  1. JSON.stringify()

    let obj = {
        name:'张三',
        age:18,
        msg:{
            say:'hello'
        }
    }
    var newObj = JSON.parse(JSON.stringify(obj))

  2. 递归

     var obj1 = {}
    ​
          function deepCopy(newObj, oldObj) {
            for (var k in oldObj) {
              // 拿到对象中的每一个值赋值给变量item
              var item = oldObj[k]
              // 判断item的基本数据类型,还是对象,还是数组
    ​
              if (item instanceof Array) {
                //数组
                newObj[k] = []
                deepCopy(newObj[k], item)
              } else if (item instanceof Object) {
                //对象
                newObj[k] = {}
                deepCopy(newObj[k], item)
              } else {
                //基本数据
                newObj[k] = item
              }
            }
          }
        deepCopy(obj1, obj)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值