首页 > 试题广场 >

js 对象的深度克隆代码实现

[问答题]
function clone(obj){
    if(!obj ||typeof(obj) != 'object') return obj;
    var r = Array.prototype.splice === obj.splice ? []:{};
    for(var i in obj){
        if(obj.hasOwnProperty(i)){
            r[i] = clone(obj[i]);
        }
    }
    return r ;
}
//数组、对象都可以for in,同时针对对象必须需要判断hasOwnProperty属性,以防克隆原型链上的属性

编辑于 2017-03-10 22:26:44 回复(7)
var deepCloneObj = JSON.prase(JSON.stringify(obj))
发表于 2018-06-10 11:17:40 回复(1)
发表于 2017-09-21 12:23:45 回复(0)
function deepCopy(obj)
{
		var type = Object.prototype.toString.call(obj);
		if(typeof obj !== "object" || obj === null)	//boolean, number, string, undefined, function, null
			return obj;
		
		//object(Date, Boolean, Number, String, RegExp, Array, Object)
		if(type === "[object Date]")			//object Date
			return new Date(obj.valueOf());
		if(type === "[object Boolean]")			//object Boolean
			return new Boolean(obj.valueOf());
		if(type === "[object Number]")			//object Number
			return new Number(obj.valueOf());
		if(type === "[object String]")			//object String
			return new String(obj.valueOf());
		if(type === "[object RegExp]")			//object RegExp
			return new RegExp(obj.valueOf());
		if(type === "[object Object]" || type === "[object Array]")
		{
			var newObj = (type === "[object Object]") ? Object.create(Object.getPrototypeOf(obj)) : [];
			var props = Object.getOwnPropertyNames(obj);
			for(var item in props)
			{
				var des = Object.getOwnPropertyDescriptor(obj, props[item]);
				if(des.hasOwnProperty("value"))
					des.value = arguments.callee(des.value);		
				Object.defineProperty(newObj, props[item], des);
			}
			return newObj;
		}
		return obj; 
}

发表于 2015-08-18 20:49:53 回复(0)
function clone(Obj) {
    var buf;   
    if (Obj instanceof Array) {
        buf = [];  // 创建一个空的数组
        var i = Obj.length;
        while (i--) {
            buf[i] = clone(Obj[i]);
        }
        return buf;
    } else if (Obj instanceof Object){
        buf = {};  // 创建一个空对象
        for (var k in Obj) {  // 为这个对象添加新的属性
            buf[k] = clone(Obj[k]);
        }
        return buf;
    }else{
        return Obj;
    }
}

发表于 2015-07-27 16:10:29 回复(0)
function copy(obj) {
    if (typeof obj !== 'object') {  return obj; }
    var result = {};
    // var result = Object.create(Object.getPrototypeOf(obj));  
  // 当需要复制原型链上的属性,可用上一条
  // 请注意:当原型链上的属性被修改时,源对象和目标对象都会发生变化!
            
    var props = Object.getOwnPropertyNames(obj);             // 获取源对象的属性,包括不可枚举的属性
   props.forEach(function (prop) {
    var dec = Object.getOwnPropertyDescriptor(obj, prop);  // 获取源对象属性的属性描述值
  Object.defineProperty(result, prop, dec);                        // 复制属性    
});
   return result;
}
发表于 2017-03-26 14:56:40 回复(0)
function cloneData(data){
            var result = [];
            if(Object.prototype.toString.call(data)) == "[Object Array]"){
                result = data.slice(0);
                return result;
            }else if(typeof data !== "object"){
                return data;
            }else{
                result = {};
                for(var i in data){
                    result[i] = typeof data[i] === "object"?cloneData(data[i]):data[i];
                }
                return result;
            }
        }
发表于 2016-09-09 15:38:55 回复(0)