源码共读(1)—— arrify

149 阅读3分钟

本文参加了由 公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。

这是源码共读的【第33期】—— 链接

自己也是刚刚开始读源码,希望自己可以坚持下去!!!

介绍

这是一个工具函数,可以将任意值转换为数组

npm地址

GitHub地址

我的GitHub代码地址

用法

具体用法npm上解释的很清楚了,这里不做赘述,重点是第三部分的源码

image.png

源码

这个工具函数的源码比较简单,就十几行代码,具体如下:
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];
}

1、Array.isArray(value)

用于确定传递的值是否是一个 Array
Array.isArray([1, 2, 3]);  // true    
Array.isArray({foo: 123}); // false    
Array.isArray('foobar');   // false     
Array.isArray(undefined);  // false

2、Symbol.iterator

(1)Iterator(遍历器)的概念

它是一种接口,为各种不同的数据结构提供统一的访问机制。
任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)

Iterator 的作用有三个:
    一是为各种数据结构,提供一个统一的、简便的访问接口;
    二是使得数据结构的成员能够按某种次序排列;
    三是 ES6 创造了一种新的遍历命令`for...of`循环,Iterator 接口主要供`for...of`消费;

(2)默认 Iterator 接口

ES6 规定,默认的 Iterator 接口部署在数据结构的`Symbol.iterator`属性,或者说,
一个数据结构只要具有`Symbol.iterator`属性,就可以认为是“可遍历的”(iterable)
const obj = {
  [Symbol.iterator] : function () {
    return {
      next: function () {
        return {
          value: 1,
          done: true
        };
      }
    };
  }
};

由此可以知道,typeof value[Symbol.iterator] === 'function', 如果 value 为可迭代对象,则返回由展开运算符转化的数组。

其他知识

源码主要就以上十几行,内容不多,但是第一次阅读源码,除了以上的内容之外,还收获了很多其他的知识;。

代码调试

juejin.cn/post/703058…

ava 简单便捷的测试运行器

github.com/avajs/ava-d…

xo 强制执行严格代码风格

www.npmjs.com/package/xo

总结一下:

学到了什么?
    1. iterator 迭代器的相关知识;
    2. Array.isArray() 用来判断元素是否为数组;
    3. 学到了js代码调试;
    4. 了解到了编写测试代码的方法;
    
遗憾/待改进的?
    1. iterator 迭代器感觉了解了,但是实际上还是有点不太会用,感觉理解的不够透彻 & 实际项目中可能会想不起来使用。
    2. 了解了测试代码,但是感觉自己还是不会在自己的项目中使用单元测试 / 编写测试代码,后续还要加强这个学习;
    3. js的代码调试使用的不够熟练,需要继续熟练一下! 
    4. 如何在自己的项目中便捷的使用debug调试呢?

- 后续如果学到了/理解了上述问题,再写文章来补充!!!