本文参加了由公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。
学习准备
- github仓库地址 arrify
- github1s: github1s.com/sindresorhu…(在线看源码可以用 github1s.com,比较快)
- 学习 Symbol.iterator 的使用场景
源码
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];
}
阅读源码
-
if (value === null || value === undefined) { return []; }判断输入的值是
null或者undefined -
if (Array.isArray(value)) { return value; }判断输入的值是数组
-
if (typeof value === 'string') { return [value]; }判断输入的值是字符串
-
if (typeof value[Symbol.iterator] === 'function') {return [...value]}判断输入的值是否有可迭代属性
Symbol.iterator,且类型为function,用扩展运算符接收可迭代对象
Symbol.iterator
Symbol是es6新增的原始类型,表示独一无二的值。
Symbol.iterator 为每一个对象定义了默认的迭代器。该迭代器可以被 for...of 循环使用。(引自MDN)
ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)。Symbol.iterator属性本身是一个函数,就是当前数据结构默认的遍历器生成函数。执行这个函数,就会返回一个遍历器。至于属性名Symbol.iterator,它是一个表达式,返回Symbol对象的iterator属性,这是一个预定义好的、类型为 Symbol 的特殊值,所以要放在方括号内(参见《Symbol》一章)。
由图片中可知,
Symbol.iterator目前只有字符串和数组支持,null和undefined浏览器会直接报错所以就不粘贴出来了。
学习总结
第一次看源码做笔记,选择了一个相对不那么多内容的,但是为了了解迭代器这一个知识点却花费了不少的时间,看来学习是偷不了懒的,不积跬步无以至千里,一起加油吧!