「我正在参与掘金会员专属活动-源码共读第一期,点击参与」
本篇文章介绍的是
axios的辅助 —— 工具函数。
拉取源码
git clone https://github.com/axios/axios.git
- 普通工具:在
/lib/utils.js目录下 - 具有特定功能的工具:在
lib/helpers目录下
工具分类
我们按照用途分类
isXXX(): 判断是否属于xx类型
这里作者还对typeof和Object的原型方法toString进行了封装。
这些连续的箭头函数很巧妙,可以临时保存函数在某个阶段的状态。kindof还做了优化,如果有命中了缓存就直接取缓存的值。
const typeOfTest = type => thing => typeof thing === type;
const kindOf = (cache => thing => {
const str = toString.call(thing);
return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());
})(Object.create(null));
const kindOfTest = (type) => {
type = type.toLowerCase();
return (thing) => kindOf(thing) === type
}
下面就归集一下isXXX()类别的方法:
isUndefinedisBuffer、isArrayBuffer、isArrayBufferView、isTypedArrayisString、isNumber、isObject、isBoolean、isPlainObject、isDate、isRegExpisFile、isBlob、isFileList、isStream、isFormData、isURLSearchParams、isHTMLForm
下面归集的是其他类别的方法:
trim: 如果字符串本身具有trim直接使用,没有的话就使用正则forEach: 将传入的不具备循环条件的obj转换为可循环的类型-数组;如果是对象则遍历它的keyfindKey:通过Object.keys()来获取所有的key,然后过滤出符合条件的。merge: 对象属性合并extend: 拷贝对象属性stripBOM: 剔除BOMinherits: 构造方法toFlatObject: 扁平化对象endsWith: 一个字符串是否以特定字符结尾toArray: 转换数组-类似arrifyforEachEntry: 迭代对象的key和valuematchAll: 将所有匹配的结果以数组返回toCamelCase: 转换为驼峰freezeMethods: 将对象的方法都冻结,只读toObjectSet: 将对象转换为SettoFiniteNumber: 转化为有限数字toJSONObject:转换为JSON对象
结束语
这是axios的普通工具类函数,工具函数就好像是“辅助”一样,在axios实现什么逻辑的时候都离不开这些“辅助”的助攻。我们如果在不清楚这个工具函数具体的用处时,可以到调用的位置,看它干了些啥。就像我们背英语单词,如果不知道它存在的意义,就去语境中去理解它一样。