之前总觉得阅读源码是一件很了不起的事情,是只有大佬才会去做的事。但在工作了一段时间后,使用了很多的优秀的框架和库后,在感叹巧妙的设计之余——有时候也会想作者到底是怎么去实现的。于是就开始尝试阅读一些源码,发现其实源码也不是想象的那么难,至少有很多看得懂。
同时,源码有也有很多值得学习和借鉴的东西,不管是应用到日常开发中还是应对面试都是非常有用的,所以还是推荐大家也去尝试阅读的。
前言
这是我的阅读源码的第二篇文章,逐渐培养每周阅读源码并写文章记录的习惯。
axios 是我们平时经常用到的网络请求库,可以同时用于 浏览器和node.js 环境中。今天我们来阅读 axios 源码,来了解其中的封装的工具函数。
如何阅读 github 上的源码
打开 axios 即可查看源码
在每一个
github
项目中的url
里直接加上1s
,就能在网页版vscode
中查看源码了。(我在上面提供的链接已经添加了1s
)
如果这个方法不可行的话,还可以使用下面的方法把源码克隆到本地中进行查看。
克隆 axios 项目查看源码
开源项目一般能在根目录下的README.md
文件或CONTRIBUTING.md
中找到贡献指南。贡献指南中说明了参与贡献代码的一些注意事项,比如:代码风格、代码提交注释格式、开发、调试等。
axios 中的工具函数
axios 的工具函数都在 utils.js 这个文件中,我们在平时也可以学习开源库的命名习惯,把工具函数放到
utils.js
文件中。
axios 源码的utils.js
文件中有很多的工具函数,为了方便大家阅读,我将文章分为上、下两部分,本文是上半部分,介绍的是 axios
实现工具函数依赖的基本函数,还有工具函数中判断数据类型的函数。下半部分,介绍的是 axios
工具函数中的非常重要且可以用于日常开发中的函数。如:merge
、extend
、forEach
等。
基础函数
先介绍几个基础函数,这几个函数会在后面的工具函数频繁使用。
typeOfTest
使用 typeOf
获取当前数据类型
const typeOfTest = type => thing => typeof thing === type;
kindOf
获取当前数据类型
这个函数的实现原理是使用Object.prototype.toString()
可以获取数据类型的特性。
var toString = Object.prototype.toString;
var o = new Object();o.toString(); // 返回 [object Object]
toString.call(new Date); // [object Date]
toString.call(Math); // [object Math]
const {toString} = Object.prototype;
const kindOf = (cache => thing => {const str = toString.call(thing);// [object Object]return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());}
)(Object.create(null));
// 返回值为 object / array ...
注意:这里使用的是
Object.create(null)
,而不是{}
。我开始以为作者是出于性能的考虑,或者只是一个编程的习惯。然后我就试着去搜索了一下,于是发现了这篇文章详解Object.create(null)。
我阅读了这篇文章,总结了使用Object.create(null)
的原因:
Object.create(null)
创建的对象是一个纯净的对象,不包含object
原型链上面的属性,可以自定义其中的属性 <