深度克隆对象

有时,我们需要对一个对象进行复制,如下列要求:

1. 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝

2. 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、Object对象。

<script>
    function isObject(obj){
        if(Object.prototype.toString.call(obj)===‘[object Array]‘ || Object.prototype.toString.call(obj)===‘[object Object]‘)
            return true;
        else
            return false;
    }
    function cloneObject(obj){
        var cloneObj;
        cloneObj=(obj instanceof Array) ? []:{}; //判断对象类型,新建克隆对象
        for(var i in obj){
            if(obj.hasOwnProperty(i)){
                cloneObj[i]=isObject(obj[i]) ? cloneObject(obj[i]):obj[i];
            }
        }
        return cloneObj;
    }

</script>

在题目中,object对象包含两种,一个是数组Array,另一个是{}

obj instanceof Array 通过判断来新建克隆对象属于哪一种



对于简单数组,我们会遇到这种情况

var ary=[1,2,3,4];
var ary1=ary;
ary[0]=8;
console.log(ary[0]);//结果为8
console.log(ary1[1]);//结果为8

为什么会出现这种情况呢?

数组是引用类型数据,在数组之间进行赋值时,没有为新的数组另外开辟内存空间,而是将新数组变量的引用地址指向了原来的数组,所以当原来数组发生变化时,新数组也会产生同样变化。

这不是我们想要的结果,那我们就需要考虑数组克隆了。

下面我们就为数组Array原型添加一个数组克隆的方法

实现数组克隆的方式很多,简单列举几种:

1. 我们最容易想到的一种方式

Array.prototype.clone=function(){
    var a=[];
    for(var i=0,l=this.length;i<l;i++)
        a.push(this[i]);
    return a;
} 

2. 通过Array对象的slice方法

slice方法是通过参数start和end的传入值来返回数组中的一段,该方法不对原数组进行操作。我们通过slice(0)可以使其返回所有项。

Array.prototype.clone=function(){
    return this.slice(0);
} 

3. 通过Array对象的concat方法

concat方法是用来实现数组的合并的。通过和一个空函数的合并,即可实现我们的克隆功能。

Array.prototype.clone=function(){
    return [].concat(this);
}
//或者
Array.prototype.clone=function(){
    return this.concat();
} 
时间: 2024-08-29 00:11:19

深度克隆对象的相关文章

js深度克隆对象

js深度克隆对象简单的记录一下,如下代码: var obj = { typeOf: function(obj) { const toString = Object.prototype.toString; const map = { '[object Boolean]': 'boolean', '[object Number]': 'number', '[object String]': 'string', '[object Function]': 'function', '[object Arr

javascript深度克隆对象

/** * * @param obj * @returns {*} */ //深度克隆 function cloneObject(obj) { if (obj === null || typeof(obj) !== 'object' || 'isActiveClone' in obj) return obj; if (obj instanceof Date) var temp = new obj.constructor(); //or new Date(obj); else var temp =

ES6深度克隆对象

'use strict'; let obj = { name:'zpf', age:18, parent:{ name:'pc', age:20 } }; let obj2 = Object.assign({},obj); obj2.name = 'aaa'; console.log(obj);

JavaScript实现对象的深度克隆【简洁】【分享】

JavaScript实现对象的深度克隆 代码实现如下: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>clone</title> 6 7 <script type="text/javascript"> 8 //对象深度克隆方法 9 10 11 ////

JS的深度克隆,利用构造函数原型深度克隆

我爱撸码,撸码使我感到快乐!大家好,我是Counter.今天来写写,JS中的深度克隆,这个在笔面试中,考的还是比较多的,主要是对象与数组的赋值,如果直接赋值的话,那么得到的是对象或者数组在堆里的地址,那么原有的的数据修改的话,那么克隆的数据也会随着修改,这就是浅克隆,所以这边就要使用到枚举,然后再每一项赋值,这样就可以完成一份深度克隆,这样原对象里修改属性,如果你在这对象修改之前已经克隆的话,那么你这个克隆的对象,对象里的属性是不变,这就是深度克隆.话不多说了,直接上代码: // 假设要克隆的对

java中传值及引伸深度克隆的思考(说白了Java只能传递对象指针)

java中传值及引伸深度克隆的思考 大家都知道java中没有指针.难道java真的没有指针吗?句柄是什么?变量地址在哪里?没有地址的话简直不可想象! java中内存的分配方式有两种,一种是在堆中分配,一种是在堆栈中分配,所有new出来的对象都是在堆中分配的,函数中参数的传递是在栈中分配的.通常情况下堆的内存可以很大,比如32位操作系统中的虚拟内存都可以被堆所使用(当内存紧张的时候甚至硬盘都可以是堆的存储空间),而堆栈的内存分配是有限的. 这和c++中内存分配差不多(c++中还要有另一种方式用于全

javascript中对象的深度克隆

零.寒暄 又是一个月多月没有更新博客了,这段时间回学校处理下论文的事情,实习的生活也暂时告一段落(在公司上班,才发现学校里面的生活简直如天堂一般,相信很多已经毕业的小伙伴肯定被我说中了,说中了请给本文点个赞,哈哈!).希望接下来自己的更新进度能加快,马上又是一年校招时,被虐也好.大牛虐别人也罢,总之祝福各位今年要找工作的小伙伴们好运.那么,今天就聊一下一个常见的笔试.面试题,js中对象的深度克隆.翻了下这个题目,在很多地方出现过,已经算一个老的题目了,但是每年的校招中总会考到,其实想想,这个题目

C#对象深度克隆

有基础的开发者都应该很明白,对象是一个引用类型,例如: object b=new object(); object a=b; 那么a指向的是b的地址,这样在有些时候就会造成如果修改a的值,那么b的值也会跟随着改变(a和b是同一个引用内存地址). 我们想要a和b都是各自互不影响的,那么只能是完全地新建一个新的对象,并且把现有对象的每个属性的值赋给新的对象的属性.也就是值类型的复制,这个操作就叫深度克隆. 这里我们写两个泛型方法分别对对象T和集合List<T>进行深度克隆的实现,我们的方法实现方式

jquery 对象数组的克隆和深度克隆

var obj1 = $.extend(false, {}, obj2);  //对象克隆 var obj1 = $.extend(true, {}, obj2);   //对象深度克隆 ----------------------------把{} 换成了[]--------------- var obj1 = $.extend(false, [], obj2);    //数组克隆 var obj1 = $.extend(true, [], obj2);    //数组深度克隆 所谓的深度就