- 本文参加了由公众号@若川视野 发起的每周源码共读活动, 点击了解详情一起参与。
- 这是源码共读的第33期链接
源码解读
export default function arrify(value){
// 展开运算符可以遍历可遍历对象(对象拥有Symbol.iterator属性)得到他的值,于是我们使用展开运算符把可遍历对象转化成数组
// 先排除null和undefined的情况,返回空数组
if(value === null || value === undefined){
return []
}
// 如果本身就是数组,就直接返回
if(Array.isArray(value)){
return value
}
// 字符串也具有Symbol.iterator属性,但是我们不希望把字符串展开转化成一个数组,所以我们需要提前单独处理字符串
if(typeof value === 'string'){
return [value]
}
// 如果是可遍历对象,将其每一项展开
if(typeof value[Symbol.iterator] === 'function'){
return [...value]
}
// 其他的数据类型,直接当成数组的第0项返回
return [value]
}
小插曲
本来感觉自己的文章就要写完了,提交作业之前查看了一下别人的作业,链接,感觉别人才是真的有在认真的思考和学习,差距很大,于是我又巩固了一下Array.from和类数组的知识。
Array.from()方法对一个类似数组或者可迭代对象创建一个新的,浅拷贝的数组实例。
Array.from(arrayLike[,mapFn[,thisArg]]
mapFn 如果指定了改参数,新数组中的每个元素会执行该回调函数。
类数组对象(拥有一个length属性和若干索引属性的任意对象)
总结
- 学习了可迭代对象
- 为了实现迭代,一个对象必须实现**@@iterator** 方法,
- Array String Set Map TypedArray 都内置了可迭代方法
- 巩固了Array.from的使用方法