前言
本文参加了由公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。
【若川视野 x 源码共读】第36期 | 可能是历史上最简单的一期omit.js 剔除对象中的属性点击了解本期详情一起参与。
准备
- 找到代码仓库,并clone下来
git clone https://github.com/benjycui/omit.js.git
- 看一下代码目录结构
看代码的目录结构,不是很复杂
src和tests目录主要是用来保存项目的源码和测试用例。.eslint*文件是eslint相关的配置.fatherrc.js是保存father的配置文件,father是一个由umi团队开发的NPM包研发工具.gitignore是git的忽略目录的配置文件.travis.yml是travis的流程配置文件,travis是一个项目持续集成的工具index.d.ts是一个typescript的描述文件,里面定义了omit函数的类型index.js是整个项目的入口,负责对外导出omit函数LICENSE是开源项目的开源协议package*.json是项目的锁定版本依赖文件和依赖文件README.md是项目的说明文档
先看了一下README.md和了解了一下omit.js主要是讲浅拷贝和忽略一些指定的字段
开始
- 安装依赖
npm i
- 执行测试用例
npm run test
(开始的时候我直接用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文件,随后启动本地服务,在浏览器中就会看到如下图的界面:
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打包。 但是感觉自己对知识的理解还处于层面级别,同志仍需努力啊