- 本文参加了由公众号@若川视野 发起的每周源码共读活动, 点击了解详情一起参与。
- 这是源码共读的第33期,链接:www.yuque.com/ruochuan12/…。
本次源码阅读的内容是 arrify , 源码非常简短:
export default function arrify(value) {
if (value === null || value === undefined) {
return [];
}
if (Array.isArray(value)) {
return value;
}
if (typeof value === 'string') {
return [value];
}
if (typeof value[Symbol.iterator] === 'function') {
return [...value];
}
return [value];
}
梳理下代码逻辑:
- 将 null 和 undefined 转换成 []
- 如果是数组,原封不动的返回
- 如果是 String 类型数据,则放入数组
- 如果 value 是可迭代对象 (e.g. Set, Map),则将其转换成数组
- 除了以上类型的数据,都将其用数组包裹后直接返回
第一遍读源码的时候发现, String类型数据的返回值和其他类型的返回值是一样的,那为什么还单独抽出一个判断逻辑呢?当查看 Symbol.iterator 的内容时发现,String 具有默认的迭代器行为,因此需要单独拿出来进行处理。
Array.prototype[@@iterator]()TypedArray.prototype[@@iterator]()String.prototype[@@iterator]()Map.prototype[@@iterator]()Set.prototype[@@iterator]()
收获
- 复习了 Symbol iterator 的知识
- 了解了 xo tsd ava
- 了解了 package.json 的具体内容