js 手写深拷贝

101 阅读1分钟

为什么有值类型和引用类型?

考虑性能问题或者存储问题,因为值类型占用空间比较小,因为只有一个值,直接放没问题。引用类型太大直接放不好管理,直接复制值的话会非常慢。 计算机所有的程序,所有的语言,值类型和引用类型严格的分离出来,他们的存储机制,他们的赋值机制,他们的copy机制也是严格的分离出来,他是基于内存的空间,cup的计算耗时去做的区分。

typeof 运算符

识别所有值类型

  • undefined
  • string
  • number
  • boolean
  • symbol

识别函数

  • typeof console.log  // function
  • typeof function(){} //function

判断是否是引用类型(不可再细分)

  • typeof null //object
  • typeof ['a','b'] //object
  • typeof {x:100} //object

解决引用类型赋值问题,深拷贝


    const obj={
        age:20,
        name:'zhangsan',
        address:{
            city:'shenzheng'
        },
        arr:['a', 'b', 'c'],
        wawa:[1,2,3,4,5]
    }  

    const obj2=deepClone(obj)
    obj2.name = '张三'
    obj2.address.city = '深圳'
    console.log('原数据--------', obj) 
    console.log('深拷贝--------', obj2) 

   //深拷贝
   function deepClone(obj){
    //obj是null,或者不是对象和数组,直接返回
    //(object 是引用类型的对象、数组、null的typeof值)     
    if(typeof obj!=='object' || obj==null){
        return obj
    }
    //初始化返回结果
    let result
    if(obj instanceof Array){
        result = []
    }else{
        result = {}
    }
    for(let key in obj){
        //保证key不是原型的属性
        if(obj.hasOwnProperty(key)){
            //递归调用
            result[key] = deepClone(obj[key])
        }
    }
    // 返回结果
    return result
   }