笔记:【若川视野 x 源码共读】 第33期 | arrify 转数组

98 阅读2分钟

1、前言

2、学习准备

  • github仓库地址:链接
  • github1s:链接
  • 这期源码行数不多, 就十几行。
  • 学习 Symbol.iterator 的使用场景
  • 这期比较简单,主要学会通过测试用例调试源码。  可以多关注怎么发布npm包的、esm、测试用例 、ts 等(也可以不关注)。
  • 建议克隆代码下来,关注测试用例,自己多通过测试用例调试,自己调试过才能够学会,感受更深一些

3、开始

3.1 arrify包

作用:Convert a value to an array ,即将一个值转化为数组形式

安装:npm install arrifyyarn 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、结语

通过这几天断断续续的写笔记,发现源码好像没那么难,也可能是我学的很简单,毕竟是第一篇么,哈哈哈,慢慢来吧,面包会有的。另外,感谢下若川大佬组织的活动!!!

附上链接: