源码共读01 arrify

41 阅读1分钟

arrify仓库地址: github

arrify功能介绍:将任何数据类型转换为数组

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

这里面就 if (typeof value[Symbol.iterator] === 'function') { return [...value]; } 比较难理解;

Symbol.iterator 是默认迭代器的标识符,判断存在迭代器就用扩展运算符(...)转为数组

延伸知识点: 生成器函数 function* , yield关键词

除了项目主体代码,对测试代码也有了解

使用nodejs ava模块,通过deepEqual,is简单对比测试运行结果

import test from 'ava';
import arrify from './index.js';

test('main', t => {
	t.deepEqual(arrify('foo'), ['foo']);
	t.deepEqual(arrify(new Map([[1, 2], ['a', 'b']])), [[1, 2], ['a', 'b']]);
	t.deepEqual(arrify(new Set([1, 2])), [1, 2]);
	t.deepEqual(arrify(null), []);
	t.deepEqual(arrify(undefined), []);

	const fooArray = ['foo'];
	t.is(arrify(fooArray), fooArray);
});