zoukankan      html  css  js  c++  java
  • 深拷贝、浅拷贝

    浅拷贝:值的引用指向新的变量,当新的变量的值有改动,那么被拷贝的变量的值也会跟着 变动

    深拷贝:申请一个新的内存空间,将被拷贝的值复制到新的内存中。拷贝变量的值改变,被拷贝的变量的值 不会改变

    实现深度拷贝

        1、JSON.stringify()

    function deepClone(obj) {
    
        let temp = JSON.stringify(obj);
        let result = JSON.parse(temp);
        
        return result;
    }
    

        2、for...in 遍历和复制

    function deepClone(obj) {
        let result = typeof  obj.splice === "function" ? [] : {};
        if( obj && typeof obj === 'object' ) {
            for( let key in obj) {
                if (obj[key] && typeof obj[key] === 'object') {
                    result[key] = deepClone(obj[key]);
                } else {
                    result[key] = obj[key];
                }
            }
            return result;
        }
        return obj;
    }
    

        3、Array.prototype.forEach

    function deepClone(obj) {
        let copy = Object.create(Object.getPrototypeOf(obj));
        let propNames = Object.getOwnPropertyNames(obj);
        propNames.forEach(function (items) {
            let item = Object.getOwnPropertyDescriptor(obj, items);
            Object.defineProperty(copy, items, item);
    
        });
        return copy;
    }
    

    实现浅拷贝

        Object.assign()

            如果对象或者数组只有一级属性没有二级属性,那么assign()方法是深拷贝。像下面的第一个例子

            如果有二级属性,那么二级以后的属性就是浅拷贝。下面的第二个例子

    let a = ["ASD", "666", "ECC", "BCC"];
    let b = [];
    Object.assign(b, a);
    b[0] = "QQQ";
    console.log(`Value of a: ${a}, Value of b: ${b}`); 
    // Value of a: ["ASD", "666", "ECC", "BCC"], Value of b: ["QQQ", "666", "ECC", "BCC"]
    
    let a = a = ["ASD", "666", "ECC", "BCC", {"name": 1, "age": 2}]
    let b = [];
    Object.assign(b, a);
    b[4].name = "QQQ";
    console.log(`Value of a: ${a}, Value of b: ${b}`); 
    // Value of a: ["ASD", "666", "ECC", "BCC", {"name": "QQQ", "age": 2}], Value of b: ["ASD", "666", "ECC", "BCC", {"name": "QQQ", "age": 2}]
    

      

  • 相关阅读:
    Redhat7.0版本下双网卡绑定
    Zabbix3.4 Proxy搭建
    Centos7 + Mariadb主从配置
    Cacti找回管理员密码
    2017科鲁兹钥匙电池更换
    Failed to set locale, defaulting to C.UTF-8 centos8.2报错
    centos8如何重启网络服务
    gem install报错 ruby升级
    vmware fusion 11.0.0激活
    转载 centos8.1网络重启
  • 原文地址:https://www.cnblogs.com/Lyh1997/p/14352159.html
Copyright © 2011-2022 走看看