zoukankan      html  css  js  c++  java
  • js深度克隆的几种方法

    方法一

    老老实实敲代码法(迭代法,适用于所有)

    1.
    function deepClone(obj) { let newObj
    = Array.isArray(obj) ? [] : {} if (obj && typeof obj === "object") { for (let key in obj) { if (obj.hasOwnProperty(key)) { newObj[key] = (obj && typeof obj[key] === 'object') ? deepClone(obj[key]) : obj[key]; } } } return newObj } const newObj = deepClone(oldObj));

    2.自己内部资料
    function DeepClone(source) {
    // 判断目标是数组还是对象
    const targetObj = source.constructor === Array ? [] : {};
    for (let key in source) {
    if (source.hasOwnProperty(key)) {
    // 如果是对象就递归
    if (source[key] && typeof source[key] === 'object') {
    targetObj[key] = source[key].constructor === Array ? [] : {}
    targetObj[key] = DeepClone(source[key])
    } else {
    targetObj[key] = source[key]
    }
    }
    }
    return targetObj
    }

    方法二

    利用JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象

    const newObj = JSON.parse(JSON.stringify(oldObj));
    

    缺点:

    • 如果obj里面有时间对象,则JSON.stringify后再JSON.parse的结果,时间将只是字符串的形式。而不是时间对象;
    • 如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象;
    • 如果obj里有function,Symbol 类型,undefined,则序列化的结果会把函数或 undefined丢失;
    • 如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null 
    • JSON.stringify()只能序列化对象的可枚举的自有属性,例如 如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor;

    方法三

    const newObj = Object.assign([],oldObj);

    缺点

    • Object.assign只对顶层属性做了赋值,完全没有继续做递归之类的把所有下一层的属性做深拷贝。

    简而言之,第一层实现了深度拷贝,后续层次还是浅拷贝

  • 相关阅读:
    springboot2.X动态修改log4j2日志级别
    iframe嵌套PMM2.0
    grafana配置告警
    prometheus+grafana配置流程
    kubernetes拉取私有镜像仓库的镜像
    Windows Server 2016离线安装.NET Framework 3.5
    Office批量授权(VL)版本和激活方法
    华为USG防火墙配置NAT映射回流解决内网通过公网映射访问内部服务器
    IRF配置
    CENTOS7安装各种桌面系统 CENTOS安装桌面图形化GUI GNOME/KDE/Cinnamon/MATE/Xfce
  • 原文地址:https://www.cnblogs.com/queenDream/p/13517486.html
Copyright © 2011-2022 走看看