Skip to content

Latest commit

 

History

History
113 lines (71 loc) · 3.1 KB

toArray.md

File metadata and controls

113 lines (71 loc) · 3.1 KB

lodash源码分析之toArray

本文为读 lodash 源码的第二百四十七篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash

gitbook也会同步仓库的更新,gitbook地址:pocket-lodash

依赖

import copyArray from './.internal/copyArray.js'
import getTag from './.internal/getTag.js'
import isArrayLike from './isArrayLike.js'
import isString from './isString.js'
import iteratorToArray from './.internal/iteratorToArray.js'
import mapToArray from './.internal/mapToArray.js'
import setToArray from './.internal/setToArray.js'
import stringToArray from './.internal/stringToArray.js'
import values from './values.js'

《lodash源码分析之copyArray》

《lodash源码分析之getTag》

《lodash源码分析之isArrayLike》

《lodash源码分析之isString》

《lodash源码分析之iteratorToArray》

《lodash源码分析之mapToArray》

《lodash源码分析之setToArray》

《lodash源码分析之stringToArray》

《lodash源码分析之values》

源码分析

toArray 的作用是将 value 转换成数组。

一些常量

const mapTag = '[object Map]'
const setTag = '[object Set]'

const symIterator = Symbol.iterator

MapSetTag 保存,方便后续使用。

也将 Symbol.iterator 保存,优化性能。

假值

if (!value) {
  return []
}

如果传入的 value 为假值,则返回一个空数组。

类数组

类数组包括字符串和其它类数组,其中字符串是分开处理的。

if (isArrayLike(value)) {
  return isString(value) ? stringToArray(value) : copyArray(value)
}

可以看到,如果是字符串,则使用 stringToArray 来转换。

如果是其它的类数组,则使用 copyArray 将原来的数组复制一次即可。

迭代器

if (symIterator && value[symIterator]) {
  return iteratorToArray(value[symIterator]())
}

如果在支持迭代器的环境中,并且 value 中又有迭代器,则使用 iteratorToArray 转换。

其它类型

const tag = getTag(value)
const func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values)

return func(value)

通过 getTag 函数获取到 valuetag

如果是 Map 类型,则使用 mapToArray 转换。

如果是 Set 类型,则使用 setToArray 转换。

其它类型,都作为对象看待,使用 values 方法转换。

License

署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)

最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见:

作者:对角另一面