【源码共读】 | arrify 转数组

121 阅读1分钟

我正在参与掘金创作者训练营第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,大概清晰这个库是干什么的了,那么他为什么不转换对象成数组呢?

github.com/sindresorhu…

image-20220831134908971

纯函数设计应该保持功能明确单一原则

判断变量是否是一个数组

const isArray = (val)=>{
    return Object.prototype.toString.call(val) === '[object Array]'
}
const isArray = (val) => {
	return typeof val[Symbol.iterator] === 'function';
}
Array.isArray(val)

开发依赖

image-20220831135445949

总结心得

这个库比较简单,但是当中的测试库,设计思想值得学习的。

  • 设计纯函数的时候应该功能单一且目的明确,尽可能地解耦
  • 可迭代对象可以使用typeof obj[Symbol.iterable] === "function"来做判断