深浅拷贝

  • 基本数据类型的特点:直接存储在栈(stack)中的数据
  • 引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里

浅拷贝

对象的直接赋值

obj1=obj2

深拷贝

JSON.parse() 与 JSON.Stringify()

先转化为字符串然后再转化为JS对象,相当于另外开辟了一块空间

  var clone = function (obj) {

       return JSON.parse(JSON.stringify(obj));
        } 

这种方法只适用于纯数据json对象的深度克隆


普用方法
  var clone = function (obj) {

                    if(obj === null) return null

                    if(typeof obj !== 'object') return obj;

                    if(obj.constructor===Date) return new Date(obj);

                    if(obj.constructor === RegExp) return new RegExp(obj);

                     var newObj = new obj.constructor ();  //保持继承链

                    for (var key in obj) {

                            if (obj.hasOwnProperty(key)) {  //不遍历其原型链上的属性

                            var val = obj[key];

                            newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除与函数名的耦合

                           }

                } 

                return newObj; 

        };