HTML5(三)——JSON,深拷贝浅拷贝

709 阅读2分钟

JSON

  1. 用于前后端数据交互的数据类型,是一个字符串
  2. Json.stringify 把object转换成string
  3. Json.parse(tmp)把string转换成object

深拷贝,浅拷贝

  • 浅拷贝:赋值地址,一个变另一个也变(数组,对象)
  • 深拷贝:一个变另一个不变(基本数据类型)

对象深克隆(仅限对象这种)

需求:将数组对象也去实现一个深拷贝的情况

解决办法:

  1. 方法一:利用stringify先转变成字符串,然后json用parse再变回对象,再改变属性值就可以达到深拷贝的效果了(实现方法如下)
<script>
        // json用于前后端数据交互
        var obj  = {
            name : "caoyuying",
            age : "18",
            info : {
                grade:19,
                profession:"CS"
            }
        }
        console.log(obj)
        console.log(typeof obj)
        var obj1 = JSON.stringify(obj)
        //想要进行对象深拷贝,必须先利用json把object变成字符串
        obj1 = JSON.parse(obj1);
        // 然后再把obj1变回对象并且赋值给自己,这一波操作之后就深拷贝了
        obj1.name = "Aiors"
        console.log(obj1.name)
        console.log(obj1);
        console.log(obj);
    </script>

  1. 方法二:提取出对象下属性的值
<script>
        var obj = {
            name:"caoyuying",
            age:"18",
            info:{
                height:"167cm",
                weight:"55kg"
            }
        }
       function deepclone(obj){
           var temp = {}
           for(var key in obj){
            //    console.log(key)
            //    console.log(obj[key])
            if(typeof obj[key] === "object"){
                temp[key] = deepclone(obj[key])
            }else{
                temp[key] = obj[key]
            }
           }
           return temp
       }
       var obj1 = deepclone(obj) //这里需要给deepclone一个接收值
       obj1.name = "Aiors"
       console.log(obj1)
       console.log(obj)
    </script>

包含基本数据类型和引用数据类型的对象深克隆

需求增加:要求不只是引用数据类型可实行深拷贝,基本数据类型也可以执行深拷贝

  1. 先判断是基本数据类型还是引用数据类型
  2. 基本数据类型直接赋值
  3. 引用数据类型判断是数组还是对象
  4. Array.isArray(params)判断是不是数组,这里利用三目运算符
  5. 再进行for...in...循环(这里注意typeof 是强制校验数据类型,无论是数组还是对象返回的都是object)
<script>
      function deepclone(params){
          var temp;
          // 先判断params是基本数据类型还是引用数据类型   
          if(typeof params === "object"){
              //判断是引用数据类型中的哪一种,是数组还是对象   
              temp = Array.isArray(params) ? []:{}
              for(var key in params){
                  if(typeof params[key] === "object"){
                      temp[key] = deepclone(params[key])
                  }else{
                      temp[key] = params[key]
                  }

              }

          }else{
              temp = params;
          }
          return temp
      }
      console.log(deepclone("abc"))
      console.log(deepclone([1,2,3,4]))
      console.log(deepclone({
          name:"caoyuying",
          age:"18"
      }))
</script>