js实现克隆,深层拷贝对象

将下面代码拷贝到html的<script></script>标签中,执行deepClone(person,person1);

        // 目标:将person拷贝到person1
        // 源对象
        var person = {
            name:"dali",  // 原始值,直接拷贝 ,栈内存拷贝
            age: 40,  // 原始值,直接拷贝
            card:["master","mazilla"], // 引用值,栈内存拷贝,只是拷贝的是地址
            wife:{ // 引用值  Object
                name:"lucy",
                age: 41,
                son: {
                    name: "feng",
                    age: 12
                }
            },
            say: function () { // 引用值 function
                console.log("oh,my god!!!");
            }
        }

        var person1 = {};
        // 遍历对象  for (var prop in obj) {} -->也可以遍历数组(数组是个特殊类型的list对象)
        // 1.判断是否是原始值  typeof() obj 引用值
        // 2.判断是数组还是对象  三种方法: 1) instansof : 跨父子域有问题 返回false 2) toString 3) constructor : 跨父子域有问题 返回false
        // 3.建立相应的数组或对象
        // 递归
        function deepClone(origin, target) {
            var target = target || {},
            toStr = Object.prototype.toString,
            arrStr = "[Object Array]"; // 数组比对
            for (var prop in origin) {
                if (origin.hasOwnProperty(prop)) {
                    if (origin[prop] !== "null" && typeof(origin[prop]) == "Object" ) { // 判断是否是引用值
                        if (toStr.call(origin[prop]) == arrStr) { // 判断是数组的场合
                            target[prop] = []; // 建立数组对象
                        } else {
                            target[prop] = {}; // 建立对象
                        }
                        deepClone(origin[prop], target[prop]); // 递归
                    } else {
                        target[prop] = origin[prop]; // 原始值,直接拷贝
                    }
                }
            }
            return target;
        }

注意:上述方法中,判断原始值,引用值的时候,可以用三目运算符进行实现

  if (toStr.call(origin[prop]) == arrStr) { // 判断是数组的场合
        target[prop] = []; // 建立数组对象
  } else {
         target[prop] = {}; // 建立对象
  }

-->
target[prop] = toStr.call(origin[prop] == arrStr) ? [] : {};

猜你喜欢

转载自my.oschina.net/korabear/blog/1805819
今日推荐