深拷贝 浅拷贝

598 阅读1分钟

一:JS数据类型

二:深浅拷贝对象:对象

  • 浅拷贝:拷贝的是栈中的地址,所以当修改其中的一个,另一个也会修改
  • 深拷贝:拷贝的值一样,但是指向的地址不一样。所以当修改其中一个并不影响另外一个

三:深拷贝代码

方法一:

  • JSON与js对象字面量区别:
  1. JSON对象的属性要加双引号
  2. 没有末尾的分号
//对象字面量
var obj = {
        name:'a'
    };
//
JSON对象
var obj = {
        “name”:'a'
    }
  • JSON方法
  1. JSON.stringify(对象):将javascript对象转成JSON字符串
 var obj = {
        name:'a',
        arr:[1,2],
        age:{
            girl:17
        }
    }
    var b = JSON.stringify(obj);//{"name":"a","arr":[1,2],"age":{"girl":17}}
    console.log(typeof b);//string
  1. JSON.parse(JSON字符串):将JSON字符串转成JS对象
var d = '{"b":"1"}'
    console.log(JSON.parse(d));//{ b: "1" }
   console.log(Object.prototype.toString.call({}));//[object Object]
  • 具体实现:
    var obj1 = {
       name:'j',
       age:18
     };
    var arr2 = JSON.parse(JSON.stringify(obj1));
    arr2.name = 's';
    console.log(arr2);//{ name: "s", age: 18 }

方法二

    //步骤:
    //1.遍历
   //2.判断原始值还是引用值 typeof
   //3.引用值,判断对象数组Object.prototype.toString.call()
   //4.建立对象或数组
   //5.递归
   function deepClone(origin,target) {
       var target = target || {},
           strTo = Object.prototype.toString,
           str = "[object Array]";//若是object,返回 [object Object]
       for (var prop in origin){
           if (origin.hasOwnProperty(prop)) { //属性是自己的不是继承过来的
               if ((typeof (origin[prop]) == "object") && (origin[prop]!==null)) {
                   //引用值,除了null
                   //判断数组或者对象
                   if (strTo.call(origin[prop]) == str) {
                       target[prop] = [];
                   } else {
                       target[prop] = {};
                   }
                   deepClone(origin[prop], target[prop]);
               } else {
                   //原始值
                   target[prop] = origin[prop];
               }
            }
       }
       return target;
   }