本文参加了由公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。
1、arrify
arrify 是一个可以将任意值转化为数组的工具
2、核心代码
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]
- 如果传入参数是部署了Iterator 接口,则使用扩展运算符转化为数组
3、iterator 遍历器
任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)
遍历过程
(1)创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。
(2)第一次调用指针对象的 next 方法,可以将指针指向数据结构的第一个成员。
(3)每一次调用 next 方法,都会返回数据结构的当前成员的信息。具体来说,就是返回一个包含 value 和 done 两个属性的对象。其中, value 属性是当前成员的值, done 属性是一个布尔值,表示遍历是否结束。
一种数据结构只要部署了 Iterator 接口,这种数据结构就是“可遍历的”。默认的 Iterator 接口部署在数据结构的 Symbol.iterator 属性
调用 iterator 接口的情景
- 扩展运算符
- 解构赋值
- for... of...
- Array.from
- Map()、Set()
具备iterator的数据结构 string、Array、Set、Map、arguments
由于string也是可遍历的,因此对string的判断必须在iterator前面,顺序不能随意改变
4、其他
- xo:
JavaScript/TypeScript linter (ESLint wrapper) with great defaults
底层封装了eslint,简化一致风格,无需配置(也支持配置)
- ava: 测试框架,并发测试,原子测试 每个测试文件有单独的进程
test() 执行一个测试,第一个参数 main 为标题,第二个参数为测试用例函数(接收一个包含内置断言 API 的参数 t
- tsd 检查typescript类型定义