【源码学习】第36期 | omit.js 剔除对象中的属性

110 阅读3分钟

前言

本文参加了由公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。

【若川视野 x 源码共读】第36期 | 可能是历史上最简单的一期omit.js 剔除对象中的属性点击了解本期详情一起参与

准备

  1. 找到代码仓库,并clone下来
git clone https://github.com/benjycui/omit.js.git
  1. 看一下代码目录结构

clipboard.png

看代码的目录结构,不是很复杂

  • srctests目录主要是用来保存项目的源码和测试用例。
  • .eslint*文件是eslint相关的配置
  • .fatherrc.js是保存father的配置文件,father是一个由umi团队开发的NPM包研发工具
  • .gitignoregit的忽略目录的配置文件
  • .travis.ymltravis的流程配置文件,travis是一个项目持续集成的工具
  • index.d.ts是一个typescript的描述文件,里面定义了omit函数的类型
  • index.js是整个项目的入口,负责对外导出omit函数
  • LICENSE是开源项目的开源协议
  • package*.json是项目的锁定版本依赖文件依赖文件
  • README.md是项目的说明文档

先看了一下README.md和了解了一下omit.js主要是讲浅拷贝和忽略一些指定的字段

开始

  1. 安装依赖
npm i
  1. 执行测试用例
npm run test

image.png

(开始的时候我直接用father test运行,报father不是内部命令,然后开始npm i的安装再运行。不太懂father是什么,研究一下)

father

father是新一代包管理工具,可以代替yarn or npm。npm指路

整理一下omit库用到的father命令

docz内置文档

"start": "father doc dev --storybook", 
"build": "father doc build --storybook", 
"gh-pages": "father doc deploy",

以上三行命令,将内置docz文档配置。文档指路

dev模式将在开发环境下,展示项目中的.md文档,本库中是README.md文件,随后启动本地服务,在浏览器中就会看到如下图的界面:

clipboard.png

doc build模式将会本地构建.doc目录,可以将其目录下文件上传到服务器。 doc deploy模式将会自动部署到gitHub目录。

"compile": "father build"
复制代码

build打包库,输出多种格式文件

"prepublishOnly": "npm run compile && np --yolo --no-publish"

其实就是一个打包工具

断言

import assert from 'assert';
import omit from '../src';

describe('omit', () => {
  it('should create a shallow copy', () => {
    const benjy = { name: 'Benjy' };
    const copy = omit(benjy, []);
    assert.deepEqual(copy, benjy);
    assert.notEqual(copy, benjy);
  });

  it('should drop fields which are passed in', () => {
    const benjy = { name: 'Benjy', age: 18 };
    assert.deepEqual(omit(benjy, ['age']), { name: 'Benjy' });
    assert.deepEqual(omit(benjy, ['name', 'age']), {});
  });
});

这里用到了断言的两个方法 assert.deepEqual 和 assert.notEqual。 assert.deepEqual是遍历对象所有自身的且可枚举的属性,进行比较相等。assert.notEqual是比较不相等,只有在实际值等于预期值时,会抛出错误。

但是在omit.js里,可枚举属性值与原对象的是相等的,但是由于Object.assign的目标对象是个新{},使用==也不再相等。

深浅拷贝

补充一下深浅拷贝。 深浅拷贝是针对Javascript中的引用类型而言,因为引用类型比较特殊,浅拷贝仅仅复制了一份引用类型在内存中的地址,两个对象的改变会同步。深拷贝将会完全创造一个新的对象,内存地址不再指向同一份内存地址,对象改变不再互相影响。

总结

看着代码就几行,但是里面涉及到的知识点好几个。这次的收获有知道了深浅拷贝Object.assign。了解了断言的assert.deepEqual 和 assert.notEqual两个方法,还学习了father打包。 但是感觉自己对知识的理解还处于层面级别,同志仍需努力啊