js深度clone

JavaScript中如何对一个对象进行深度clone?

一道百出不厌的面试题。

方式

上一篇写到了 引用数据类型 这里就会用上了
var a = [9, 5, 2, 7];
var b = a;
a.push(0);
console.log(b); // [9, 5, 2, 7, 4]

由于引用类型数据存储在应用地址内存中,因此赋值复制的也是这一块地址,因此相当于两个数组对象引用了一块数据地址,所以对a或者b的任何操作或者改变都会体现在对象中。

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;
        }
    }

利用三元运算符 可以让代码更精简一点 毕竟提高效率也是程序员必不可少的技能嘛~

function clone(obj) {
  var o = obj instanceof Array ? [] : {};
  for(var k in obj) 
    o[k] = typeof obj[k] === Object ? clone(obj[k]) : obj[k];
  return o;
}

var a = [[1, 2, 3], [4, 5, 6, 7]];
var b = clone(a);
console.log(b);

再讲一种上一篇提到的 object.prototype.toString.call()的方法

Object.clone=function(obj){
				if (typeof (obj)=="object"){
					var o =Object.prototype.toString.call(obj) == "[object Array]"?[]:{};
					for(var key in obj){
						if (obj.hasOwnProperty(key)){
							//如果key是obj的自有属性
							o[key]=arguments.callee(obj[key]);
							//arguments.callee(obj[key])调的是当前的object.clone函数;
							
						}
					}return o;
				}else {
					//如果obj是原始数据类型的值,就直接返回副本
					return obj;
				}
			}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值