深拷贝的原生js实现

<html>
<head>
    <title></title>
</head>
<body>
<script type="text/javascript">
function copy(arr){
    var obj=arr.constructor==Array?[]:{};
  //第二种方法 var obj=arr instanceof Array?[]:{}
    for(var item in arr){
        if(typeof arr[item]==="object"){
            obj[item]=copy(arr[item]);
        }else{
            obj[item]=arr[item];
        }
    }
    return obj;
}
var obj={a:1,b:2,c:{d:1,e:[3,4,5]}}
var newobj=copy(obj);
obj.c.e.push(7);
console.log(obj);
console.log(newobj);
</script>
</body>
</html>

深拷贝的原生js实现

上面代码中有测试输出原对象和深拷贝到newobj上的新对象,如果深拷贝成功的话,obj里面的引用类型改变值,是不会影响到新对象的。以下是在控制台打印的结果:

深拷贝的原生js实现

果然obj和newobj的引用类型互相没有影响,而不像浅拷贝那样引用类型共享。