你不会还不知道arrify的内部到底是怎么执行的吧?

news2025/5/28 1:06:46

作为一个前端工程师,经常会遇见转换成数组的需求,被转换的对象有可能是String、Set()、null、Map()、undefined、或者是数组本身。我们最经常的做法就是写一个arrify函数帮我去进行转换。久而久之因为经常会做不同的项目中遇到同样的需求所以我们通常会把他封装成一个npm包发布出去,方便于代码的重复应用,和引用。

那arrify包我们就经常用了,那你知道arrify包里面的代码是怎么执行的吗?接下来就跟我一起好好分析一下源码!

arrify源码

既然是要了解它是如何执行的,那就得从源码入手。老规矩先上源码!

JavaScript源码

export default function arrify(value) {//判断是否是否是null,或者undefined
	if (value === null || value === undefined) {
		return [];
	} //判断是否是数组
	if (Array.isArray(value)) {
		return value;
	} //判断是否是string
	if (typeof value === 'string') {
		return [value];
	}//判断是否是Set()、Map()
	if (typeof value[Symbol.iterator] === 'function') {
		return [...value];
	}//用数组的形式返回我们的value
	return [value];
} 

在JavaScript的源码中我们可以很明显的看见,在arrify函数中,利用if对函数接收的值进行判断。

  • 如果函数接收的值是null,或者undefined,直接返回一个空数组。* 如果函数接收的值是一个数组(利用Array.isArray(value)进行判断,数组自带的一个判断方法,如果传入的值是数组就就会返回true,否则返回false),直接返回自身。* 如果函数接收的值是string(typeof value === 'string'利用typeof进行判断),把接收的值放在数组里进行返回* 如果函数接收的值是Set()、Map()(利用typeof value[Symbol.iterator] === 'function'利用typeof[Symbol.iterator]进行判断,),解构Set()里的值放到数组中进行返回(利用ES6的结构语法...)。测试

当然我们写出一个函数当时少不了测试环节,对函数的功能进行测试是必不可少的。那如果我们用人工的方式进行测试将每一种类型的值都传入然后将返回结果打印在控制台来测试很明显是一件吃力不讨好的事,特别是在我们的项目特别巨大的时候,功能特别复杂的时候,更加是不合理的方式。

那我们要如何在用最轻松的方式去获得准确的测试结果呢?

自动化测试工具AVS,

那我们在arrify中应该如何利用ava去编写自动化测试呢?

那为什么是AVA呢?

  • 轻量化和效率高
  • 语法简单,编写轻松
  • 并发运行测试运行效率高
  • 包含 TypeScript 和 Flow 的类型定义 首先我们要安装AVA插件
npm init ava 

然后我们要在我们的package.json中修改我们的scripts执行脚本

{
	"scripts": {
		"test": "ava "
}, 

接下来我们就要开始编写我们的测试脚本test

  • 首先我们要从到ava中导入我们的test方法和我们编写的arrify 函数
import test from 'ava';
import arrify from './index.js'; 
  • 然后我们要利用我们导入的test方法进行测试。* 第一个参数是我们测试的名称* 第二个参数要求是一个传入的是一个回调函数,在回调函数里编写我们的测试语法
test('测试名称', t => {
...测试语法
}); 
  • 然后我们要用t.deepEqual()函数来编写我们的测试代码* 第一个参数是我们测试的输入值* 第二个参数是我们测试的输出参考值,如果得到的返回值参考值相同测试就通过,否则相反
import test from 'ava';
import arrify from './index.js';
test('main', t => {//输入一个'foo'字符串,返回结果应该是['foo']
	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);
}); 

测试结果

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/334868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WeNet - 初识

文章目录关于 WeNet快速上手识别训练环境准备训练关于 WeNet Production First and Production Ready End-to-End Speech Recognition Toolkit github: https://github.com/wenet-e2e/wenet官方中文说明:https://github.com/wenet-e2e/wenet/blob/main/README_CN.md…

分享宠物店微信小程序制作步骤_宠物店管理系统怎么做

大多数人对于动物医疗专业知识比较匮乏,再加上宠物医疗费用,日常用品都略高,宠物店/宠物医院的前景,再未来依旧可观。 相比于实体店,线上平台无疑有着更广阔的拓客渠道和销售前景,做宠物店/宠物医院小程序…

Java进阶(下篇)

Java进阶(下篇)Java进阶 P387一、IDEA使用与多线程1.概述①idea安装②IDEA常用设置③idea快捷键设置④模板的使用和设置2.程序进程、线程概念3.单核cpu与多核cpu任务执行_ 并行与并发4.多线程优点5.创建多线程方式一:继承Thread类6.线程常用方…

[oeasy]python0078_设置索引颜色_index_color_ansi_控制终端颜色

更多颜色 回忆上次内容 上次 了解了 高亮颜色 91-97 是 高亮 前景色101-107是 高亮 背景色 颜色种类 在原来基础上 增加了一些但也非常有限 还想要 更精细的颜色 有可能吗??🤔 更多颜色 继续深挖 关于 逃逸字符的文档 可以用 索引颜色 …

MyBatis源码概述及运行原理解析(篇一)

🐦MyBatis源码概述及运行原理解析 MyBatis的整体架构分为三层,分别是基础支持层、核心处理层和接口层 🖌 中文注释源码Git地址 🖽架构图 📂源码结构 📁parsing包 🗊parsing包对应基础支持层中…

Matlab论文插图绘制模板第76期—半对数刻度折线图(Semilogx和Semilogy)

在之前的文章中,分享了Matlab双对数刻度折线图的绘制模板: 进一步,再来分享一下半对数刻度折线图的绘制模板。 先来看一下成品效果: 特别提示:Matlab论文插图绘制模板系列,旨在降低大家使用Matlab进行科研…

为什么bitnami 安装的软件进入容器,用户名都是I have no name

文章目录背景原因user 参数的缺陷一### user 参数的缺陷二Docker 官方的解决方案背景 在bitnami 安装的软件进入容器用户名都显示I have no name,这是什么原因呢? 原因 在k8中容器默认好像是以uid1001启动的,可以修改该uid docker 启动的时…

leaflet 实现左卷帘效果 (代码示例045)

第045个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中实现左卷帘效果,这里主要引用了leaflet-side-by-side这个插件,直接调用的话,CSS方面有些问题,需要自行调整一下。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配…

目标检测论文阅读:GaFPN算法笔记

标题:Construct Effective Geometry Aware Feature Pyramid Network for Multi-Scale Object Detection 会议:AAAI2022 论文地址:https://ojs.aaai.org/index.php/AAAI/article/view/19932 文章目录Abstract1. Introduction2. Related Work2.…

探索 Google 的 Bard AI 的强大功能

谷歌最近推出了名为“Bard AI”的新人工智能项目。 该项目旨在改善人工智能的语言和创造力,是谷歌旨在推进人工智能发展的更大“红色代码”计划的一部分。 该项目的主要目标是开发一种可以生成创意写作的语言模型。 什么是巴德人工智能? Bard AI 是一种…

Python 数据库开发实战 - Python与Redis交互篇- 缓存新闻数据至redis

实现新闻缓存功能 - “news_dao.py” - 从数据库提取明确的新闻数据保存至 redis - search_cache() 方法 只有在新闻被管理员审批通过的时候,新闻才可以缓存到 redis 里面。 管理员在 “审批新闻” 的时候是可以获得到 “被审批通过的新闻” 的 id,所以…

Allegro如何用Label Tune功能自动调整丝印到器件中心

Allegro如何用Label Tune功能自动调整丝印到器件中心 在做PCB设计的时候,调整丝印是比较费时的工作,如果需要把整板的丝印位号调整到器件的中心做装配图使用,Allegro的Label Tune功能支持快速把丝印位号居中到器件中心。 以下图为例,快速把所有丝印位号居中 调整前 调整后…

若依框架 --- 偶发的el-select无法选择的问题

👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者 📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…

RBCD深度利用之“烂番茄”

1.RBCD简介 本篇文章是在基于资源的约束委派的基础上的一个利用,篇幅会比较短,但个人认为利用面还是挺广泛的。于是就写一下。 首先,需要了解的是RBCD的基础知识: 简单回顾一下: 基于资源的约束委派(RBCD) 只支持2…

微电网两阶段鲁棒优化经济调度方法[3]【升级优化版本】(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑…

【论文速递】NAACL2022-DEGREE: 一种基于生成的数据高效事件抽取模型

【论文速递】NAACL2022-DEGREE: 一种基于生成的数据高效事件抽取模型 【论文原文】:DEGREE A Data-Efficient Generation-Based Event Extraction Mode 【作者信息】:I-Hung Hsu , Kuan-Hao Huang, Elizabeth Boschee &#xff…

【总结】1591- 从入门到精通:使用 TypeScript 开发超强的 CLI 工具

作为一名开发者,掌握 CLI 工具的开发能力是非常重要的。本文将指导你如何使用 TypeScript 和 CAC 库开发出功能强大的 CLI 工具。快速入门首先,需要先安装 Node.js 和 npm(Node Package Manager),然后在项目目录中创建…

【正点原子FPGA连载】第七章程序固化实验摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

第七章程序固化实验 在前面的几个实验中,我们都是通过JTAG接口将FPGA配置文件和应用程序下载到MPSOC器件中。接下来我们将尝试把程序存储在非易失性存储器中,在上电或者复位时让程序自动运行,这个过程需要启动引导程序(Boot Load…

【STM32笔记】HAL库UART串口配置及重定向(解决接收中断与scanf不能同时工作的问题)

【STM32笔记】HAL库UART串口配置及重定向&#xff08;解决接收中断与scanf不能同时工作的问题&#xff09; 首先 要使用printf和scanf 必不可少的就是 #include <stdio.h>这里需要做的就是配置单片机的UART 并且使其能够被printf和scanf调用 打开异步工作模式 并且选择…

openGauss单机版升级示例(2.0.1—>3.1.1)

文章目录前言一、升级前的准备工作二、升级主要步骤1、查看当前数据库版本2、创建临时目录用于存放安装文件3、下载最新需要升级的版本并解压4、执行前置脚本 openGauss的 gs_preinstall5、执行升级操作6、升级检查7、提交升级&#xff1a;三、附本期小知识前言 数据库版本升级…