我正在参与掘金创作者训练营第6期,点击了解活动详情
本文已参与「新人创作礼」活动,一起开启掘金创作之路。
本文参加了由公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。
【若川视野 x 源码共读】第33期 | arrify 转数组 点击了解本期详情一起参与。
前言
arrify这个库是干什么的?
源码比较简单,直接上源码
功能:传入值,然后将其转为数组
- 值为空或者undefined
- 直接返回空数组
- 值为可迭代对象
- 返回浅拷贝数组
- 值为String
- 用数组包装一下
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];
}
OK,大概清晰这个库是干什么的了,那么他为什么不转换对象成数组呢?
纯函数设计应该保持功能明确单一原则
判断变量是否是一个数组
const isArray = (val)=>{
return Object.prototype.toString.call(val) === '[object Array]'
}
const isArray = (val) => {
return typeof val[Symbol.iterator] === 'function';
}
Array.isArray(val)
开发依赖
avawww.npmjs.com/package/ava…- 测试类库
tsdwww.npmjs.com/package/tsd…- 检查
TypeScript类型定义,编写类型测试 xowww.npmjs.com/package/xo- 内置
ESlint检查规则
总结心得
这个库比较简单,但是当中的测试库,设计思想值得学习的。
- 设计纯函数的时候应该功能单一且目的明确,尽可能地解耦
- 可迭代对象可以使用
typeof obj[Symbol.iterable] === "function"来做判断