本文参加了由公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。
- github仓库地址 arrify
- github1s: github1s.com/sindresorhu…
对所有的数据类型都转为数组
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方法:
Array.prototype[@@iterator]()TypedArray.prototype[@@iterator]()String.prototype[@@iterator]()Map.prototype[@@iterator]()Set.prototype[@@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'