背景
在npm上查找arrify,戳这里,这个包的数据还是挺厉害。
实践
根据他的README来实操感受一下。
简单来说arrify是一个数组转换工具,可以传入任意值转换成数组。
源码
arrify代码仓库地址,戳这里
下载代码到本地
git clone git@github.com:sindresorhus/arrify.git
vscode打开项目arrify,通过GitLens插件可以了解到该项目是在9年前初始化的,最近一次更新是在2年前。
首先查看package.json
, 整个库采用esm
编写,还有依赖了哪些库,可执行的命令脚本只有一个test
,那就安装依赖,来执行一下这个test
指令。
其中开发依赖了三个库:
-
xo: 一个默认值很高的 js/ts linter (ESLint包装器) -
ava: nodejs的测试运行器 -
tsd: 为类型定义编写测试,是.test-d.ts扩展文件
安装依赖:
npm install
执行测试用例:
npm run test
终端输出结果如下:
这里的报错是应该tsd
的缘故,为了ts
类型兼顾,问题出在了index.test-d.ts
,和主程序index.js
无关,ts
相关知识还得加强,这里就不深纠,为强迫症考虑,可以test
指令中移除 tsd
"scripts": {
"test": "xo && ava"
},
执行之后再终端输出如下:
调试
安装个vscode插件,Code Debugger,可以省去自己配置写调试launch,安装了插件之后再package.json
的scripts
上会有调试开关,
从package.json
里似乎看不出来test
指令执行哪个文件,但通过了解一下ava
,戳这里,这个测试插件默认会执行项目根目录下test.js
。
那点击之后,执行的是test.js
这个测试用例文件,代码如下:
import test from 'ava';
import arrify from './index.js';
test('main', t => {
t.deepEqual(arrify('foo'), ['foo']);
t.deepEqual(arrify(new Map([[1, 2], ['a', 'b']])), [[1, 2], ['a', 'b']]);
t.deepEqual(arrify(new Set([1, 2])), [1, 2]);
t.deepEqual(arrify(null), []);
t.deepEqual(arrify(undefined), []);
const fooArray = ['foo'];
t.is(arrify(fooArray), fooArray);
});
测试用例中测试了多种情况,
-
传入字符串类型 -
Map类型 -
Set类型 -
null -
undefined
在主程序,也就是arrify方法里标注断点,调试就阻断在这儿,说明以上分析的流程正确,也可以在这儿查看传入值的变化情况。
赏析
arrify这个方法进行了4个判断,
-
当传入值是 null
或者undefined
,直接返回空数组 -
传入值是数组类型时,返回其本身 -
传入值是字符串类型时,返回一个只包含该字符串的数组 -
传入迭代器的情况,主要来分析一下 -
传入值都没满足if判断时,例如value是一个对象,一个数字,直接返回数组包含
Synbol.iterator
Symbol.iterator 为每一个对象定义了默认的迭代器。该迭代器可以被 for…of 循环使用。
ES6中,数组、类数组、Map和Set集合,都具有iterator迭代器接口,意味着他们都是可以被循环遍历的,大白话就是可以支持依次处理该结构的所有成员项。
例如数组:
例如Map:
可以看到,Symbol.iterator会返回一个对象,这就是一个遍历器对象,而作为遍历器对象,其必须具备的特征就是必须具备next()方法。
其中比较特殊的就是字符串的处理,它单独占据一个if判断,并没有像数值类型一样直接返回[value]
,因为字符串类型也可以遍历。
那如果不在迭代器判断之前进行了字符串的判断,会导致字符串类型返回成截断字符串组成的一个数组,
arrify就是为了让传入的值如果是像Map和Set这类结构,返回其自身数据的数组格式。
原文始发于微信公众号(前端一起学):源码赏析·数组转换工具arrify
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/191378.html