• 深拷贝 与 浅拷贝


    浅拷贝

    只对第一从重新赋址,里面的内容依旧是原来的地址let newdata = Object.assign([], ary1, ary2, ...)

    1、Object.assign()

    let a = {};
    Object.assign({}, a) === a; // false
    
    let c = {b: {}};
    Object.assign({}, c).b === c.b; // true
    

    2、利用扩展运算符

    // 对象
    let a = {b: 2}
    let newdata = {...a}
    // 数组
    let a = [1, 2, 3]
    let newdata = [...a]
    

    深拷贝

    对深层嵌套的数据结构进行拷贝,每一层都要重新赋址

    递归

    缺点:当对象存在循环引用时,会死递归,解决方案,可以来个对象,数组,new Map(),等来记录,已拷贝的对象,如果存在相同的,就做特殊处理

    let copyAry = [];
    function deepCopy(data) {
      copyAry.push(data);
      const newData = Array.isArray(data) ? [] : {};
      if (data && typeof data === "object") {
        for (let k in data) {
          if (data.hasOwnProperty(k)) {
            if (data[k] && typeof data[k] === "object") {
              if (copyAry.includes(data[k])) {
                newData[k] = data[k] // 当存在已拷贝的对象时,可以直接赋值或者给 null,从此之后,无法实现拷贝。
              } else {
                newData[k] = deepCopy(data[k]);
              }
            } else {
              newData[k] = data[k];
            }
          }
        }
      }
      console.log(newData);
      return newData
    }
    
    let a = {
      b: 1,
    }
    a.c = a
    deepCopy(a)
    

    JSON.parse(JSON.stringify())

    遇到对象中有以下情况 会出错。
    1.原对象中值为 undefined 或者 function类型 的key会丢失
    2.时间对象,会变成字符串形式
    3.RegExp定义的属性会变成 {}
    4.NaN 类型会变成 null
    5.对象存在循环引用,会报错 Uncaught TypeError: Converting circular structure to JSON,将循环结构转换成JSON

    let a = {
      a: { b: 1, c: [1, 2]},
      c: 2
    }
    let newdata = JSON.parse(JSON.stringify(a))
    
  • 相关阅读:
    Bash : 冒泡排序
    Azure Load Balancer : 支持 IPv6
    Azure Load Balancer : 简介
    sudo 与输出重定向
    Linux lsof 命令
    Bash : IO 重定向
    LVM : 快照
    2014年全年总结
    使用Kindle4rss推送自己感兴趣的博文
    换SSD硬盘,重装系统,一阵子忙乱
  • 原文地址:https://www.cnblogs.com/MrZhujl/p/16254995.html
Copyright © 2020-2023  润新知