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