js基本数据类型和引用数据类型以及深浅拷贝

基本数据类型
  • Number、String、Boolean、Null、Undefined、Symbol()六种
引用数据类型
  • Object(Array、Function、Date、RegExp)

判断对象类型的方法?见博客https://blog.csdn.net/qq_38700448/article/details/100306197

区别:
  • 基本数据类型存储在栈里面,引用数据类型存储在堆里面(指向堆的引用地址存储在栈中)
  • 堆和栈的区别
    • 栈的内存空间大小是固定的,数据大小是固定的,并且用完后会被系统自动回收
    • 堆是动态分配内存,数据大小是不固定的并且不会被系统自动回收
浅拷贝和深拷贝:是相对于引用类型而言
  • 对于基本数据类型,复制直接是值复制,栈中会开辟一个新空间来存储,所以相互不会产生影响

    var a = 2;
    b = a;
    b = 3;
    console.log(a,b)  //2 3
    //a b 是存储在栈中不同的位置,所以相互没有任何影响
    
  • 对于引用数据类型,复制的是引用地址,共同指向堆中的数据,所以两者是相互联系的

    var obj = {name:'js'}
    var obj1 = obj;
    obj1.name = 'javaScript'
    obj1.age = '10'
    console.log(obj,obj1) 
    //{name: "javaScript"} {name: "javaScript"}
    
    //修改obj1对象,相当于是直接操作堆中的数据,而obj存储的引用地址指向的是同一堆,所以输出一样
    
  • 针对引用类型的复制分为浅拷贝和深拷贝

    • 浅拷贝

      //实现浅拷贝的两种方式
      //1、var newObj = {...obj};
      //2、var newObj = Object.assign({},obj)
      
      var obj = {name:'浅拷贝',children:['vue','react']};
      var obj1 = {...obj}
      obj1.age = 18
      obj1.name = 'obj1浅拷贝'
      obj1.children.push('Angular'); //会改变obj、obj1、obj2的chi ldren
      var obj2 = Object.assign({},obj)
      obj2.age = 20
      
      console.log(obj.children) //['vue','react','Angular']
      console.log(obj1.children) //['vue','react','Angular']
      console.log(obj2.children)    //['vue','react']
      
      //Object.assign(target,source1,source2...sourceN)  
      //将所有源对象的可枚举属性合并到目标对象target中
      //并且后出现的同名属性会覆盖前面的
      var source1 = {name:'js'}, source2 = {name:'javaScript'}, source3 = {age: 18}, source4 = {hobby:'折磨人'}
      
      var newObj = Object.assign({},source1,source2,source3,source4)
      
      问题:浅拷贝可以实现一维对象深层拷贝,但是对于多维实现不了(浅拷贝顾名思义就是只能保证保证复制的第一层是相互独立的)
    • 深拷贝:实现深层拷贝,父子对象相互独立,互不影响
      //实现深层拷贝的两种方式
      //1、var newObj = JSON.parse(JSON.stringify(obj))
      //2、函数deepCopy实现
      
      function deepCopy(obj) {
        var result = Array.isArray(obj) ? [] : {};
        for(i in obj) {
          if(obj.hasOwnProperty(i)) {
            item = obj[i];
            if(item && item instanceof Object) {
              result[i] = deepCopy(item)
            } else {
              result[i] = item;
            }
          }
        }
        return result;
      }
      
      //同样用浅拷贝的数据,来对比一波
      var obj = {name:'浅拷贝',children:['vue','react']};
      
      var newObj = deepCopy(obj);
      newObj.children.push('Angular');
      
      console.log(newObj.children) //['vue','react','Angular']
      console.log(obj.children)    //['vue','react']
      
      //使用深拷贝,可以保证父子对象相互独立,互不影响
      
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值