精华内容
下载资源
问答
  • 最近闲来无事,发现想要深拷贝一个对象,但是对象里面有function。这时候使用json转换就会出现错误,这里我自己封装了一个方法,希望对大家有帮助。 function createObj() { this.a = 1; this.b = [1, "2"]; this...

    js实现深拷贝对象function的方法


    最近闲来无事,发现想要深拷贝一个对象,但是对象里面有function。这时候使用json转换就会出现错误,这里我自己封装了一个方法,希望对大家有帮助。

    function createObj() {
        this.a = 1;
        this.b = [1, "2"];
        this.c = { c: "ccc", ob: { a: "dasd" } };
        this.fn = function (a) {
            return this.b[0] + a;
        }
    }
    var obj = new createObj();
    //   这里再随意加一些属性
    obj.c.ob.fn=function (a){
        return a*a;
    }
    obj.c.ob.b=[1,{a:"1"}];
    //  深拷贝
    function kaobei(obj) {
        if (typeof obj == "object") {
            if (Array.isArray(obj)) {
                let arr = [];
                for (let item of obj) {
                    arr.push(Object.assign(kaobei(item)));
                }
                return arr;
            } else if (obj == null) {
                return null;
            } else {
                let obj1 = {};
                for (let index in obj) {
                    obj1[index] = kaobei((obj[index]));
                }
                return obj1;
            }
        } else if (typeof obj == "function") {
            return Object.assign(obj);
        } else if (typeof obj == undefined) {
            return undefined;
        } else {
            return obj;
        }
    }
    //	输出出来看看
    console.log(kaobei(obj));
    
    

    vscode输出如下
    在这里插入图片描述
    请忽略我的命名

    展开全文
  • 所谓深拷贝与浅拷贝,乍听我也蒙了,仔细看其实就是C#中值类型复制和引用类型复制的区别。深拷贝就是引用类型复制时不仅仅将引用复制,同时还将数据复制了份,从而得到了liang'gen

    所谓深拷贝与浅拷贝,乍一听我也蒙了,仔细一看其实就是C#中值类型复制和引用类型复制的区别。

    值类型自然不存在这个概念,因为你怎么复制都是两个数据,但是引用类型就不一样了,引用类型涉及到引用的复制和值的复制问题。因此下面没有提到数据类型时候都是在说引用类型哈!

    深拷贝就是引用类型复制时不仅仅将存在栈中的引用复制,同时还将堆中的数据复制了一份,从而得到了两份数据。

    浅拷贝就是平常的赋值方式,仅仅将栈中的引用复制了,但是堆中的数据并没有复制。

    【值类型数据放在栈中;引用类型数据在堆中,引用在栈里】


    1.引用类型中常见的深拷贝方式

    ①数组:采用es6的...展开

        let a=[1,2,3],

        let b=[...a];

    ②json:采用es6的...展开

        let a={"c":12};

        let b={...a};

    ③系统对象

        Date等,直接将其实例作为新对象创建过程中构造函数的参数即可【因为系统对象已经帮你实现了这个过程】

        let a=new Date();

        let b=new Date(a);

        这样b就对a实现了深拷贝

    ④自定义对象

         与系统对象方式一样,但是前提你要自己写拷贝方法。

    ⑤symbol类型

        有关symbol内容请看:https://es6.ruanyifeng.com/#docs/symbol

         symbol类型的深拷贝要利用symbol.for进行,同时利用ES2019 提供了一个实例属性description,直接返回 Symbol 的描述。

          let s1=symbol.for('wayne');

          let s2=symbol.for(s1.description);

    这样s2就实现了对s1的深拷贝。

    2.完整深拷贝通用代码

            //[4]深拷贝方法
    	function clone(data){
    		//1.判断symbol类型
    		if (typeof data=="symbol"){
    			return symbol.for(data.description);
    		}
    		//2.判断值类型(即不是object类型)
    		else if (typeof data!="object"){
    			return data;
    		}
    		//3.判断数组
    		else if (data.constructor===Array){
    			return data.map(i=>clone(i));
    		}
    		//4.判断json类型
    		else if (data.constructor===Object){
    			let tem={};
    			for(let key in data){
    				tem[key]=clone(data[key]);
    			}
    			return tem;
    		}
    		//5.判断系统对象和自定义对象
    		else{
    			return new data.constructor(data);
    		}
    	}

    注意,对于数组和json格式来说,单纯的...展开只能实现一层的拷贝,如果想多层拷贝,就要用到上述代码中3和4所写的那样,利用递归。

    3.总结

    目前针对深拷贝浅拷贝就这么多,欢迎留言指正讨论

    展开全文
  • JavaScript:手写一个JS深拷贝

    千次阅读 2020-04-08 17:31:24
    最著名的乞丐版实现,在《你不知道的JavaScript(上)》里也有提及: 乞丐版 var newObj = JSON.parse( JSON.stringify( someObj ) ); 面试够用版 function deepCopy(obj){ //判断是否是简单数...

    🔗 https://juejin.im/post/5c9c3989e51d454e3a3902b6


    有个最著名的乞丐版实现,在《你不知道的JavaScript(上)》里也有提及:

    乞丐版

     var newObj = JSON.parse( JSON.stringify( someObj ) );
    

    面试够用版

    function deepCopy(obj){
        //判断是否是简单数据类型,
        if(typeof obj == "object"){
            //复杂数据类型
            var result = obj.constructor == Array ? [] : {};
            for(let i in obj){
                result[i] = typeof obj[i] == "object" ? deepCopy(obj[i]) : obj[i];
            }
        }else {
            //简单数据类型 直接 == 赋值
            var result = obj;
        }
        return result;
    }
    
    展开全文
  • js深拷贝一个对象

    千次阅读 2019-05-23 10:38:28
    var clone = function (obj) { if(obj === null) return null if(typeof obj !== 'object') return obj; if(obj.constructor===Date) return new Date(obj); if(obj.constructor === RegExp) re...
    var clone = function (obj) { 
        if(obj === null) return null 
        if(typeof obj !== 'object') return obj;
        if(obj.constructor===Date) return new Date(obj); 
        if(obj.constructor === RegExp) return new RegExp(obj);
        var newObj = new obj.constructor ();  //保持继承链
        for (var key in obj) {
            if (obj.hasOwnProperty(key)) {   //不遍历其原型链上的属性
                var val = obj[key];
                newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除与函数名的耦合
            }
        }  
        return newObj;  
    };

    如果只是浅层次的对象 如:

    var fence_form = {
            add_name: "", //名称
            point: "", //点
            radius: "", //半径
            time: [], //有效时间
            merArr: []
    }

    则用下面这个方法比较简单 :

    var a = {name:'wanger'}
    var b = Object.assign({}, a)
    a===b // false

     

    展开全文
  • js深拷贝

    2020-06-23 15:11:19
    关于深拷贝和浅拷贝的更多细节,请参考js深拷贝和浅拷贝小结 、赋值、浅拷贝与深拷贝的区别 二、深拷贝的方法 1.JSON转换 var targetObj = JSON.parse(JSON.stringify(copyObj)) let arr4 = JSON.parse...
  • js深层拷贝

    千次阅读 2018-09-12 19:58:35
    拷贝分为浅层拷贝和深层拷贝,在js中拷贝主要针对于对象...原来那个不会变化,要考虑到对象里面可以嵌套对象,要做到这完全深拷贝,方法有多种,以下两种供大家看。 方法function deepcopy(obj){ i...
  • JavaScript 深拷贝

    2019-08-13 11:03:39
    JavaScript 深拷贝 目录JavaScript 深拷贝常见的错误1. 数组拷贝用Array.prototype.slice()2. 过分依赖 JSON.parse(JSON.stringify(obj))实现深拷贝 常见的错误 1. 数组拷贝用Array.prototype.slice() ​ 这是一个...
  • 手写一个javascript深拷贝不香吗?! 背景 学过js的小伙伴都知道浅拷贝和深拷贝, 像简单的复制,Object.assin()(只有一层数据的时候),concat()等之类的都是浅拷贝, 深拷贝像JSON.parse(JSON.stringify())等之类的 ...
  • 深拷贝:开辟了块新的内存存放地址和地址指向的对象,原地址的任何对象改变了,深拷贝出来的对象不变。 浅拷贝数组(只拷贝第级数组): 1.直接遍历 var arr = [1,2,3,4]; function copy(arg){ ...
  • JS浅拷贝,深拷贝,完全深拷贝【总结】

    千次阅读 热门讨论 2018-07-15 21:10:42
    javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法 ...因此,数组以及对象的深拷贝就是javascript一个基本功了。 首先说明,深拷贝和浅拷贝已经不是绝对的概念了,而是相对的概念,因为有一层深...
  • javascript深拷贝

    2019-12-05 17:34:01
    js浅拷贝与深拷贝 基本数据类型不会存在浅拷贝,引用数据类型存在浅拷贝 深拷贝方法 、纯数组拷贝:(仅限于不嵌套) 1,for循环: var arr1 = [1, 2, 3]; var arr2 = []; for (var i = 0; i < arr1.length; i+...
  • Javascript 深拷贝

    2021-08-04 23:08:03
    Javascript 深拷贝一个面试经常遇到的问题。深拷贝主要考察两点: 1、JavaScript的数据类型 2、递归算法 话不多说,我们直接看代码 // js 内置的特殊对象类型 const specialTypes = { '[object Date]': val =&...
  • js深拷贝对象

    2019-11-23 15:53:58
    function deepCopyObj (source) { let newObj = JSON.parse(JSON.stringify(source)); copyFunction(newObj, source);... //深拷贝function; function copyFunction(newObj, source) { for(let i i...
  • <script> var arr1 = [1,2,3,{a:4}]; var arr2 = []; //浅拷贝 function shallowCopy... //普通元素为深拷贝,对象为浅拷贝 function copy(a1, a2){ //a2 = a1.slice();//第种 //a2 = a1.concat()...
  • javascript深拷贝引发的深入思考

    千次阅读 2020-08-29 21:23:03
    A同学:深拷贝是另一个对象占用另一块内存就行了,随手写出了如下代码: let a = { name: "lcy", age: 18 }; let b = Object.assign({}, a); console.log(JSON.stringify(b, null, 2)); let c = {}; for (let ...
  • JavaScript深拷贝

    2021-05-23 21:38:21
    前言 基本数据类型:number, string, boolean, null, undefined, symbol,...我们在实际的项目中,肯定不能让每个对象的值都指向同一个堆内存,这样的话不便于我们做操作,所以自然而然的诞生了深拷贝 深拷贝作用在引
  • js 深拷贝

    2018-08-27 14:13:29
    js深拷贝方式:  1、递归实现。 function clone(data) { if (typeof data === 'object') { var newData = Array.isArray(data) ? [] : {}; for (var i in data) { newData[i] = ...
  • 今天的学习笔记写在了自己的网页笔记本上,没有记录到博客,但是学到一个有关深拷贝的实现方法,为加深印象,这里给大家分享一下: 深拷贝:就是拷贝到最底层的属性。 function deepCopy(object){ //这里传入一个...
  • 数组深拷贝 1、最简单的方法:使用ES6扩展运算符 var arr = [1,2,3,4,5] var copy = […arr] 测试: var arr = [1,2,3,4,5] var copy = [...arr] arr[2] = 5 console.log(arr) console.log(copy) 2、js数组concat/...
  • //一个简单的基于循环的js深拷贝 functioncopy(obj){ if(Array.isArray(obj)){ letarr=[]; for(leti=0;i<obj.length;i++){ arr[i]=obj[i]; } returnarr; ...
  • 【问】:写一个函数实现js深拷贝? 【答】: var deepClone = function (obj) { if(obj === null) return null if(typeof obj !== 'object') return obj; if(obj.constructor===Date) return new Date(obj); ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,398
精华内容 9,359
关键字:

js如何深拷贝一个function