omit.js 源码阅读

126 阅读1分钟
omit.js

此js作用为用于删除对象中某个或某几个属性,返回值为删除属性后的对象,并且不改变原有的对象。

源码如下:

function omit(obj, fields) {
  // Object.assign--浅拷贝,第一层数据深拷贝,第二层嵌套数据为浅拷贝
  const shallowCopy = Object.assign({}, obj);
  for (let i = 0; i < fields.length; i += 1) {
    const key = fields[i];
    delete shallowCopy[key];
  }
  return shallowCopy;
}

此处源码将会将会创建一个与obj一样的对象(内容一样,但是存放的地址不一样),然后将传入的fields字段过滤掉返回新的对象。

总结:
  1. 从源码中看如果obj中存在了引用数据,则obj中对象和返回对象的数据将会指向同一地址,二者在改变时将会同时相互影响,即第一层为深拷贝,第二层为浅拷贝。
  2. 如果想要实现深拷贝由两种方式,第一种是JSON.stringify,第二种是递归。两种方式各有优缺点,JSON方式是简单,但是存在函数与时间等特殊类型的数据时将会丢失掉,对象中存在循环引用的情况也无法正确实现深拷贝,递归方式是效率较低,递归层次太深,耗内存且容易栈溢出一定要使用的话,最好使用缓存避免相同的计算,限制递归调用的次数,但是相对JSON不会存在数据丢失的情况,精度较高。