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

    浅拷贝demo:

    var a = [1, 2, 3, 4, 5];
    var b = a;
    a[0] = 2
    console.log(a);
    console.log(b);
    
    //因为b浅拷贝a, ab指向同一个内存地址(堆内存中存的值)
    //b会随着a的变化而变化
    //[2, 2, 3, 4, 5]
    //[2, 2, 3, 4, 5]
    

    深拷贝demo:

    
    
    1.JSON方法实现 (常用)
    //_tmp和result是相互独立的,没有任何联系,有各自的存储空间。
    let deepClone = function (obj) {
        let _tmp = JSON.stringify(obj);//将对象转换为json字符串形式
        let result = JSON.parse(_tmp);//将转换而来的字符串转换为原生js对象
        return result;
    };
    
    let obj1 = {
        weiqiujaun: {
            age: 20,
            class: 1502
        },
        liuxiaotian: {
            age: 21,
            class: 1501
        }
    };
    
    let test = deepClone(obj1);
    console.log(test);
    
    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]);//如果对象的属性值为object的时候,递归调用deepClone,即在吧某个值对象复制一份到新的对象的对应值中。
                } else {
                    result[key] = obj[key];//如果对象的属性值不为object的时候,直接复制参数对象的每一个键值到新的对象对应的键值对中。
                }
    
            }
            return result;
        }
        return obj;
    }
    
    let testArray = ["a", "b", "c", "d"];
    let testRes = deepClone(testArray);
    console.log(testRes);
    console.log(typeof testRes[1]);
    
    let testObj = {
        name: "weiqiujuan",
        sex: "girl",
        age: 22,
        favorite: "play",
        family: {brother: "son", mother: "haha", father: "heihei"}
    };
    let testRes2 = deepClone(testObj);
    testRes2.family.brother = "weibo";
    console.log(testRes2);
    
    3.利用数组的Array.prototype.forEach进copy
    
    let deepClone = function (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;
    };
    
    let testObj = {
        name: "weiqiujuan",
        sex: "girl",
        age: 22,
        favorite: "play",
        family: {brother: "wei", mother: "haha", father: "heihei"}
    }
    let testRes2 = deepClone(testObj);
    console.log(testRes2);
    
    4.浅拷贝(使用object.assign方法)(常用)
    
    let target=[];
    let testArr=[2,3,5,8];
    Object.assign(target,testArr);
    console.log(target);
    testArr.push(8);
    console.log("我是原来的"+target+",我是现在的"+testArr);
    

      

  • 相关阅读:
    网页结构的简介和Xpath语法的入门教程
    (原创)WinForm中莫名其妙的小BUG——ComboBox 尺寸高度问题
    (原创)WinForm中莫名其妙的小BUG——RichTextBox自动选择字词问题
    Docker(1)概述
    Docker(2)centos7.X下安装
    Docker(5) docker部署nginx
    Docker(3)阿里云镜像加速
    Docker(4)docker常用命令
    Docker学习路线
    weblogic重要漏洞记录
  • 原文地址:https://www.cnblogs.com/junjun-001/p/12696397.html
Copyright © 2011-2022 走看看