【若川视野 x 源码共读】第33期 | arrify 转数组

100 阅读1分钟

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

对所有的数据类型都转为数组


export default function arrify(value) {
  if (value === null || value === undefined) {
    return [];
  }
  if (Array.isArray(value)) {   // 标记条件1
    return value;
  }
  if (typeof value === "string") {
    return [value];
  }
  if (typeof value[Symbol.iterator] === "function") {  // 标记条件2
    return [...value];
  }
  return [value];
}

关于arrify中 判断条件中注释部分 标记条件1 与 标记条件2 不考虑为条件重合,标记条件2主要针对于有迭代器的数据类型:如自定义迭代器,类数组arguments和nodeList


let nodeList = document.querySelectorAll('div');

typeof nodeList[Symbol.iterator] === 'function' //true

Array.isArray(nodeList)  // false

关于Symbol.iterator 的使用场景

Symbol.iterator 为每一个对象定义了默认的迭代器。该迭代器可以被 for...of 循环使用

一些内置类型拥有默认的迭代器行为,其他类型(如 Object)则没有。下表中的内置类型拥有默认的@@iterator方法:

let arr = [1,2]
typeof arr[Symbol.iterator]    // 'function'

let arr = '777'
typeof arr[Symbol.iterator]   // 'function'

let arr = '777'
arr[Symbol.iterator]  // ƒ [Symbol.iterator]() { [native code] }

let arr = {a:1}
typeof arr[Symbol.iterator]   // 'undefined'