【源码共读】第33期 | arrify转数组

114 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

本文参加了由公众号@若川视野 发起的每周源码共读活动点击了解详情一起参与。

本篇是源码共读第33期 | arrify转数组,点击了解本期详情

开始

什么是arrify?。arrify是指将值转换为数组。官方有给出相关的例子,可以看看官方说明

1、拉取代码

git clone https://github.com/sindresorhus/arrify.git

2、阅读源码

export default function arrify(value) {
        //判断如果是null或者是undefined就直接返回一个空数组
	if (value === null || value === undefined) {
		return [];
	}
        //判断如果是数组就直接返回value
	if (Array.isArray(value)) {
		return value;
	}
        //判断如果是String就直接返回[value]
	if (typeof value === 'string') {
		return [value];
	}
        //判断如果是可迭代对象,浅拷贝迭代值创建新数组,这里的迭代选择器还得回顾一下
	if (typeof value[Symbol.iterator] === 'function') {
		return [...value];
	}

	return [value];
}

3、测试

测试我直接就放在浏览器上测试了。

function arrify(value) {
        //判断如果是null或者是undefined就直接返回一个空数组
	if (value === null || value === undefined) {
		return [];
	}
        //判断如果是数组就直接返回value
	if (Array.isArray(value)) {
		return value;
	}
        //判断如果是String就直接返回[value]
	if (typeof value === 'string') {
		return [value];
	}
        //判断如果是可迭代对象,浅拷贝迭代值创建新数组,这里的迭代选择器还得回顾一下
	if (typeof value[Symbol.iterator] === 'function') {
		return [...value];
	}

	return [value];
}
console.log(arrify());//[]
console.log(arrify([]));//[]
console.log(arrify('123'));//["123"]
console.log(arrify({aa:'bb'}));//[{aa: "bb"}]
console.log(arrify([1,2,3]));//[1, 2, 3]
console.log(arrify([{aa:'bb'},{cc:'dd'}]));////[{aa: "bb"},{cc:'dd'}]

按测试结果来看,还是能很好的理解的。接下来就回顾一下那个迭代器是个什么玩意儿。

Symbol.iterator

1、什么是Symbol.iterator

每一个数组、伪数组、new Set()、 new Map() 中都有一个Symbol.interator 接口,每个Symbol.interator中都抛出一个next() 函数,next 中都返回两个属性,一个value,一个done。 任何事务(包含对象/数组/伪数组…)只要其中含有Symbol.iterator接口,表示它可以被for…of所循环

2、有什么用?

Symbol.iterator 为每一个对象定义了默认的迭代器,该迭代器可以被 for…of 循环使用 我们也可以自定义symbol.iterator属性为任意对象值定义自己的迭代器逻辑,他将覆盖默认的迭代器。

举例
var test = {}
test[Symbol.iterator] = function* () {
     yield 1;
     yield 2;
     yield 3;
};
[...test] // [1, 2, 3]

总结

本次的arrify是指将值转换为数组,还是很好理解的。可能就是这个Symbol.iterator有点难懂,但是如果多用例子来测试几遍,可能会更好理解一些。这次也收获颇多呀