zoukankan      html  css  js  c++  java
  • vue项目使用深拷贝

    浅拷贝 : 只是将数据中所有的数据引用下来,依旧指向同一个存放地址,拷贝之后的数据修改之后,也会影响到原数据的中的对象数据。例如:Object.assign(),...扩展运算符

    深拷贝: 将数据中所有的数据拷贝下来,对拷贝之后的数据进行修改不会影响到原数据。

    JSON.parse(JSON.stringify(obj))深拷贝的问题

    1、如果obj里面存在时间对象,JSON.parse(JSON.stringify(obj))之后,时间对象变成了字符串。
    2、如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象。
    3、如果obj里有函数,undefined,则序列化的结果会把函数, undefined丢失。
    4、如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null。
    5、JSON.stringify()只能序列化对象的可枚举的自有属性。如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor。
    6、如果对象中存在循环引用的情况也无法正确实现深拷贝。

    适用于vue深拷贝

    function coppyArray(arr){
       return arr.map((e)=>{
            if(typeof e==='object'){
               return Object.assign({},e);
             }else{
               return e;
           }
         }) 
     }  //这个好像不兼容IE所以使用下面那个
    function copyArray(arr){
      return JSON.parse(JSON.stringify(arr));      
    }

    递归实现深拷贝

    function copy (obj) {
        let newObj = null
        if (typeof obj === 'object' && obj !== null) {
            newObj = obj instanceof Array ? [] : {}
            for (let i in obj) {
                newObj[i] = typeof obj[i] === 'object' ? copy(obj[i]) : obj[i]
            }
        } else {
            newObj = obj
        }
        return newObj
    }
  • 相关阅读:
    CSPS_108
    TortoiseGit配置密钥的方法
    SLF4J和Logback和Log4j和Logging的区别与联系
    slf4j log4j logback关系详解和相关用法
    dubbo服务telnet命令的使用
    基于IDEA的JavaWeb开发环境搭建
    jdk8--十大新特性
    jdk8--collect总结
    字符串的排列
    调整数组顺序使奇数位于偶数前面
  • 原文地址:https://www.cnblogs.com/dianzan/p/14718782.html
Copyright © 2011-2022 走看看