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

文章介绍了前端开发中常用的arrify函数,用于将不同类型的值转换为数组。函数通过条件判断处理null、undefined、字符串、Set和Map等类型。文章还探讨了使用自动化测试工具AVA进行测试的方法,包括安装、配置及编写测试脚本,以确保arrify函数的正确性。
摘要由CSDN通过智能技术生成

作为一个前端工程师,经常会遇见转换成数组的需求,被转换的对象有可能是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);
});

测试结果

image.png

还有一些相关知识:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zayyo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值