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

177 阅读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];
}

阅读源码

  • if (value === null || value === undefined) { return []; }

    判断输入的值是null或者undefined

  • if (Array.isArray(value)) { return value; }

    判断输入的值是数组

  • if (typeof value === 'string') { return [value]; }

    判断输入的值是字符串

  • if (typeof value[Symbol.iterator] === 'function') {return [...value]}

    判断输入的值是否有可迭代属性Symbol.iterator,且类型为function,用扩展运算符接收可迭代对象

Symbol.iterator

Symbol是es6新增的原始类型,表示独一无二的值。

Symbol.iterator 为每一个对象定义了默认的迭代器。该迭代器可以被 for...of 循环使用。(引自MDN)

ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)。Symbol.iterator属性本身是一个函数,就是当前数据结构默认的遍历器生成函数。执行这个函数,就会返回一个遍历器。至于属性名Symbol.iterator,它是一个表达式,返回Symbol对象的iterator属性,这是一个预定义好的、类型为 Symbol 的特殊值,所以要放在方括号内(参见《Symbol》一章)。

arrify.png 由图片中可知,Symbol.iterator目前只有字符串和数组支持,nullundefined浏览器会直接报错所以就不粘贴出来了。

学习总结

第一次看源码做笔记,选择了一个相对不那么多内容的,但是为了了解迭代器这一个知识点却花费了不少的时间,看来学习是偷不了懒的,不积跬步无以至千里,一起加油吧!