1、前言
- 本文参加了由 公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与
- 这是源码共读的第33期,链接:第33期|arrify转数组
2、学习准备
- github仓库地址:链接
- github1s:链接
- 这期源码行数不多, 就十几行。
- 学习 Symbol.iterator 的使用场景
- 这期比较简单,主要学会通过测试用例调试源码。 可以多关注怎么发布npm包的、esm、测试用例 、ts 等(也可以不关注)。
- 建议克隆代码下来,关注测试用例,自己多通过测试用例调试,自己调试过才能够学会,感受更深一些。
3、开始
3.1 arrify包
作用:Convert a value to an array ,即将一个值转化为数组形式
安装:npm install arrify 或 yarn add arrify
使用:import arrify from 'arrify'; arrify(value)
3.2 源码
/**
* 将任意值转为数组形式
* value 入参任意数据类型
*(在下面判断中包含了null、undefined、array、string、function)
* [value] 返回数组
*/
export default function arrify(value) {
/* 判断value 是 null 或者 undefined,返回空数组(基本数据类型:null,undefined)*/
if (value === null || value === undefined) {
return [];
}
/* 判断value 是否为Array,是则返回数组 */
if (Array.isArray(value)) {
return value;
}
/* 判断value 是否为 string 类型,是则返回数组(基本数据类型:string)*/
if (typeof value === "string") {
return [value];
}
// 判断对象是否是一个可迭代对象,返回[value]
//(用于判断 value 是否有遍历器属性,即是否可以被 for of 遍历出来)
if (typeof value[Symbol.iterator] === "function") {
return [...value];
}
return [value];
}
(1)、一个小问题:对string类型的value,使用 typeof value[Symbol.iterator] ,返回值也是 function,为什么要单拿出来,并在判断对象是否是可迭代对象之前判断呢?
- 答:在做迭代判断的语句中,使用[...value],会把string类型的value分割成单独的字符
例:xx = "ewr";
yy = [xx] //["ewr"]
zz = [...xx] //['e','w','r']
(2)、我们在调试代码的时候,可以看到test 引入了三个包:ava、tsd、xo;
- ava:AVA is a test runner for Node.js --AVA是Node的测试运行程序。
- tsd:Check TypeScript type definitions --检查ts的类型定义
- xo: JavaScript/TypeScript linter (ESLint wrapper) with great defaults -- ESLint包装器
(3)、说一下 Symbol.iterator
Symbol.iterator 为每一个对象定义了默认的迭代器。该迭代器可以被 for...of 循环使用。
let xx = {}; // 定义一个对象
xx[Symbol.iterator] //为对象添加了一个默认的迭代器
/* 迭代器: 迭代器是一个对象,它定义一个序列,并在终止时可能返回一个返回值。(详见 链接 mdn相关) */
4、结语
通过这几天断断续续的写笔记,发现源码好像没那么难,也可能是我学的很简单,毕竟是第一篇么,哈哈哈,慢慢来吧,面包会有的。另外,感谢下若川大佬组织的活动!!!
附上链接: