• [记录] JavaScript 中的深浅拷贝(克隆)


    浅拷贝和深拷贝针对的是Object、Array这样复杂的引用类型数据
    简单说:浅拷贝只复制一层的属性,而深拷贝则递归复制所有层级的属性

    一、浅拷贝

    function clone(origin, target) {
        var result = target || {};
        for ( var prop in origin ){
            target[prop] = origin[prop];
        } 
        return result;
    }
    

    如果对象的属性值是数组或对象,实际上,存储的值是一个内存地址;
    原始数据和拷贝的数据指向的是同一个地址,可能别篡改。

    二、深拷贝
    思路:
    遍历对象 for (var prop in obj)
    1. 判断是不是原始值 typeof() object
    2. 判断是数组还是对象 instanceof constructor toString(在iframe父子作用域中依旧正确)
    3. 建立相应的数组或对象 然后递归

    function deepClone(origin, target) {
        var target = target || {},
            toStr = Object.prototype.toString,
            arrStr = "[object Array]";
        for(var prop in origin) {
            // 判断对象是否包含特定的自身属性
            if(origin.hasOwnProperty(prop)) {
                // 排除null这个特殊的object并且是对象类型的引用类型数据
                if(origin[prop] !== null && typeof(origin[prop]) == 'object'){
                    target[prop] = (toStr.call(origin[prop]) == arrStr) ? [] : {};
                    deepClone(origin[prop], target[prop]);
                }else{
                    // 拷贝基本类型数据
                    target[prop] = origin[prop];
                }
            }
        }
        return target;
    }
    

    深拷贝不仅将原对象的基本类型数据拷贝,而且将原对象上的引用类型数据采用递归的方式拷贝到新的对象上。这样就不会出现引用类型数据指向同一对象的问题。

    jQuery提供了 $.extend() 深浅拷贝方法
    浅拷贝:$.extend({}, obj1, obj2);
    深拷贝:$.extend(true, obj1, obj2); 

  • 相关阅读:
    基于springboot框架的博客系统
    告别并不遥远的儿时,抬眼期待未来
    Python微信公众号教程基础篇——收发文本消息
    华为云落地敏捷+DevOps,助力大企业高效能
    【nodejs原理&源码赏析(5)】net模块与通讯的实现
    华为云&华中大联合实验室,夺得2019ICDAR发票识别竞赛世界第一
    00034_类与对象
    php批量下载文件
    php批量下载图片
    asp.net批量下载文件
  • 原文地址:https://www.cnblogs.com/yuxi2018/p/9445393.html
Copyright © 2020-2023  润新知