【源码学习】arrify 转数组

117 阅读3分钟

源码功能

arrify接受任何数据,返回数组形式。分别对空值,数组、字符串、带有迭代器的数据格式进行处理。

源码

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];
}



思维导图

arrayJs.png

package.json

package的配置项:

  • script:定义包的脚本,使用npm run + “定义脚本“,可以运行当前项目
  • bin:添加可执行全局脚本,可以自定义全局命令名称,全局下载包后,在命令行中使用自定义脚本运行项目
  • type: 包的模块化规范,不设置是默认commonjs规范
  • main:包的入口文件,browser和node环境都可以使用
  • module: 包的入口文件,定义npm包的ESM规范文件,browser和node环境都可以使用,
  • browser:定义npm包在browser环境的入口
  • 同时使用main、module、browser配置,构建工具构建后,模块加载顺序browser+mjs> module >browser+cjs >main
  • exports: 定义npm包的导出,可以全部导出,按引入方式导出,按环境类型引入,exports优先级高,高于main、file、browser、module优先级
  • peerDependencies:理解为npm包安装的前置依赖条件,配置为npm包核心依赖包,可以解决核心依赖包重复安装问题。

Symbol

Symbol是es6原生提供的新的基本数据类型,生成一个唯一值,用在对象中作为唯一属性。
Symbol的特性:

  • Symnol是基本数据类型,直接调用生成变量Symbol(),不可以使用new来调用
  • Symbol生成的值是唯一的,使用相同描述重复声明的两个Symbol变量不相等
  • Object.getOwnPropertyNames()获取对象属性名,会忽略Symbol值的属性名,可以通过Object.getOwnPropertySymbols()方法获取symbol值的属性
  • JSON.tringfy()序列化会忽略Symbol为属性名的属性
  • Object.keys(),for...of,for...in 循环中会跳过Symbol值的属性
  • ES6 有很多内置方法使用Symbol类型为属性名

Symbol.png

迭代器和生成器

Iterator

Iterator概念

Iterator是一种机制,为不同的数据结构提供统一访问的机制。使用[Symbol.iterator]属性实现,返回一个迭代器。已部署iterator接扣的数据结构,可以使用for..of遍历。

[Symbol.iterator]是一个函数,返回一个迭代器,可以自定义函数,指定数据结构的迭代顺序。

已部署iterator接口的数据结构,在以下语法里,自动调用

  • for...of
  • ...扩展运算符
  • [...arr]解构运算
  • yeild* : 后面跟的是一个可遍历结构,它会调用该结构的遍历器接口
  • Array.from()
  • Map()/Set()/WeakMap()/WeakSet()
  • Promise.all()
  • Promise.race()

ES6原生提供的可迭代数据结构有

  • Array
  • Map
  • Set
  • String
  • TypeArray
  • 函数的arguments对象
  • NodeList对象 类数组对象可以使用Array.from()方法转换为数组,使用for...of
for...of与其他遍历方法的区别
  • for...of只能遍历已部署[Symbol.iterator]接口的数据结构,不能遍历对象
  • for...of、for循环、for...in可以跳出循环,map、forEach等数组迭代方法不可以跳出循环
  • for..of循环,获取的是每一项的value,for...in获取的是每一项的key

iterator.png

微信截图_20230723185609.png