【若川视野-源码共读】第33期 | arrify转数组

133 阅读2分钟

本文参加了由公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。

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: 测试框架,并发测试,原子测试 每个测试文件有单独的进程

image.png test() 执行一个测试,第一个参数 main 为标题,第二个参数为测试用例函数(接收一个包含内置断言 API 的参数 t

  • tsd 检查typescript类型定义