Javascript深度拷贝

这里用递归的思想进行JS对象的深度拷贝,并进行封装,思路以下

  1. 判断是否是原始值 使用方法:typeof()/object javascript

  2. 判断是数组仍是对象 使用方法: instanceof toString constructorjava

  3. 创建相应的数组或对象数组

  4. 循环递归bash

function deepClone(origin,target){
		var target = target || {},
			toStr = Object.prototype.toString,
			arr = "[object Array]";

		for(var prop in origin){
			if(origin.hasOwnProperty(prop)){ //选择本身的属性
				if(origin[prop] !== 'null' && typeof(origin[prop]) == 'object'){//区分原始值和引用值
					if(toStr.call(origin[prop]) == arr){//区分数组和对象
						target[prop] = [];//创建数组
					}else{
						target[prop] = {};//创建对象
					}
					deepClone(origin[prop],target[prop]); //循环递归
				}else{
					target[prop] = origin[prop];
				}
			}
		}
		return target;
	}复制代码

代码能够将中间target[prop]赋值操做用三目运算符简化以下:

target[prop] = (toStr.call(origin[prop]) == arr) ? [] : {};ui

所以 简化后的深度拷贝的代码最后以下:
function deepClone(origin,target){
    var target = target || {},//容错
    toStr = Object.prototype.toString,//.call
    arr = "[object Array]";//数组原型

    for(var prop in origin){
        if(origin.hasOwnProperty(prop)){//判断是不是本身的属性
            if(origin[prop] !== 'null' && typeof(origin[prop]) == 'object'){//判断引用值仍是原始值
	        target[prop] = (toStr.call(origin[prop]) == arr) ? [] : {};//判断是数组仍是对象 而后相应创建数组/对象
		deepClone(origin[prop], target[prop]);//循环递归
	    }else{//原始值
		target[prop] = origin[prop];
	    }
         }
    }
    return target;
}复制代码

最后,咱们能够建立两个对象来进行深度拷贝
var obj1 = {
    name : 'sunny',
    age : 100,
    sayName : function(){
    console.log(this.name);
    }
}
var obj2 = {};复制代码

执行拷贝this

deepClone(obj1, obj2);//放入源对象和拷贝对象复制代码
相关文章
相关标签/搜索