Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

lodash源码分析之toArray #248

Open
HeftyKoo opened this issue May 4, 2020 · 0 comments
Open

lodash源码分析之toArray #248

HeftyKoo opened this issue May 4, 2020 · 0 comments
Labels
api 暴露出来的接口 系列文章

Comments

@HeftyKoo
Copy link
Owner

HeftyKoo commented May 4, 2020

本文为读 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)

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

作者:对角另一面

@HeftyKoo HeftyKoo added 系列文章 api 暴露出来的接口 labels May 4, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api 暴露出来的接口 系列文章
Projects
None yet
Development

No branches or pull requests

1 participant