zoukankan      html  css  js  c++  java
  • 前端小知识(10)--js深拷贝

    JavaScript 深拷贝

    浅拷贝和深拷贝的区别

    首先,需要明白在赋值的时候有个传值和传址的区别。在JavaScript中,简单数据类型(null,undefined,string,number,boolean)在赋值的时候,其实是传值,而对象类型object(包括[],{},function,Date(),RegExp()等)都是传址。

    对于深拷贝而言,所有的值都需要重新开辟内存空间,而不是传递内存地址。

    深拷贝的实现

    1. Object.assign({}, obj)

    let user = {
      name: '张三'
    }
    let userCopy = Object.assign({}, user)
    

    缺点:只对第一级的变量是深拷贝

    2. JSON.parse(JSON.stringify(obj))

    优点:简单

    缺点:无法拷贝正则表达式,undefined,function,null

    3. {...obj}

    let user = {
      name: '张三',
      age: undefined
    }
    let userCopy = {...user}
    user.name = "李四"
    console.log(JSON.stringify(user))
    console.log(JSON.stringify(userCopy))
    
    // output
    // {"name":"李四"}
    // {"name":"张三"}
    

    优点:简单

    缺点:只是对于第一级的变量是深拷贝

    4. 递归

    function deepCopy(obj){
      let res = (obj instanceof Array ? [] : {});
      for (const [k, v] of Object.entries(obj)) {
        res[k] = (typeof v == "object" ? deepCopy(v) : v);
      }
      return res;
    }
    

    优点:对于数组、对象、函数都可以支持,支持null,undefined

    缺点:对于Date(),RegExp()无法支持,可以添加对于类型的判断以实现实际情况中的深拷贝需求

  • 相关阅读:
    IDEA导入springboot项目报错:non-managed pom.xml file found
    Keepalived高可用集群(还没细看)
    Keepalived服务
    *** WARNING
    POJ 2185 Milking Grid (搬运KMP)
    POJ 1961 Period (弱鸡三战KMP)
    POJ 2752 Seek the Name, Seek the Fame (KMP next数组再次应用)
    POJ 2406 Power Strings(KMPnext数组的应用)
    杂模板
    URAL
  • 原文地址:https://www.cnblogs.com/njuclc/p/13255194.html
Copyright © 2011-2022 走看看