关于深拷贝浅拷贝,原型,类型校验,递归深拷贝

JavaScript 专栏收录该内容
5 篇文章 0 订阅
  • 浅拷贝是拷贝一层,深层次的对象级别的就拷贝引用;深拷贝是拷贝多层,每一级别的数据都会拷贝出来;
  • 浅拷贝和深拷贝都只针对于引用数据类型,浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存;但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象;
  • 区别:浅拷贝只复制对象的第一层属性、深拷贝可以对对象的属性进行递归复制;

深拷贝方式

JSON.parse(JSON.stringify(obj)) //最简单的深拷贝方式
//递归进行深拷贝
function deepCopy(data) {
	if (typeof data !== "object") return data
    let newObj = Array.isArray(data) ? [] : {}
    for (const key in data) {
        newObj[key] = obj[key] instanceof Object ? deepCopy(data[key]) : data[key]
        }
        return newObj
      }

数据类型校验

  • typeof - 直接返回数据类型字段,但是无法判断数组、null、对象
  • instanceof - 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型
  • constructor - null 和 undefined 是无效的对象,因此是不会有 constructor 存在的,这两种类型的数据需要通过其他方式来判断。
    函数的 constructor 是不稳定的,这个主要体现在自定义对象上,当开发者重写 prototype 后,原有的 constructor 引用会丢失,constructor 会默认为 Object
  • object.prototype.toString.call() - toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。
    对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。

原型:
示意图原型示意图

  1. 所有对象都有__proto__属性。
  2. 只有函数对象才有prototype属性。
  3. protoype对象默认有两个属性:constructor 和 proto。
  4. 实例对象的__proto__指向的是函数的protoype
  5. 函数对象的prototype属性是外部共享的,而__proto__是隐式的。
  6. 函数和Object的__proto__的顶端是null
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值