值类型 引用类型 深拷贝

值类型 引用类型 深拷贝

PS:整理下之前的学习笔记分享下,欢迎指正,不喜勿喷_

  • 值类型变量:字符串 number 布尔变量 symbol undefined

  • 引用类型变量 :函数 对象 数组 null

typeof 方法可以判断值类型变量得到具体它类型,判断引用类型的到 object 不可细分得到具体是对象还是数组,typeof 判断函数为function;

  • 值类型和引用类型变量存储特征:
    值类型变量保存到栈中,用完就销毁,是直接存储变量的名和值, 赋值时,深复制直接将变量值复制给另外一个变量,修改时互相不影响;
    引用类型变量名保存在栈,值保存在堆中, 复制时实际上是赋值值的存储地址,传递引用,浅复制,修改变量的值会相互影响,同一个地址访问的值一样。

关于存储位置的大胆猜测存储位置不一样:性能问题,值类型简单,占空间小,直接赋值,引用类型变量复杂,空间占用大,直接赋值慢,所以赋值引用地址。

  • 引用类型的变量实现像值类型变量一样赋值 深度拷贝实现思路
  1. 判断传入的参数是否为引用数据类型,若是简单数据类型则直接返回传入的参数;
  2. 判断传入的参数是数组还是对象,分别初始化对应的结构;
  3. 使用 for in 遍历对象,判断该属性是否为对象的自有属性obj.hasOwnProperty(key);
  4. 判断对应的属性值是否为引用数据类型,若是引用数据类型,则需要递归调用该函数,若不是则直接添加到初始化的结构上。
function deepClone(obj) {
// 判断传入的参数是否为引用数据类型,若是简单数据类型则直接返回传入的参数;
  function isObject(para) {
    return (typeof para === "object" || typeof para === "function") && para !== null;
  }

  if (!isObject(obj)) {
    return obj;
  }
  // 判断传入的参数是数组还是对象,分别初始化对应的结构;
  let cloneObj = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
  // 使用 for in 遍历对象,判断该属性是否为对象的自有属性obj.hasOwnProperty(key);
    if (obj.hasOwnProperty(key)) {
    // 判断对应的属性值是否为引用数据类型,若是引用数据类型,则需要递归调用该函数,若不是则直接添加到初始化的结
      cloneObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key];
    }
  }
  return cloneObj;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值