Skip to content

Latest commit

 

History

History
93 lines (65 loc) · 2.79 KB

size.md

File metadata and controls

93 lines (65 loc) · 2.79 KB

lodash源码分析之size

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

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

依赖

import getTag from './.internal/getTag.js'
import isArrayLike from './isArrayLike.js'
import isString from './isString.js'
import stringSize from './.internal/stringSize.js'

《lodash源码分析之getTag》 《lodash源码分析之isArrayLike》 《lodash源码分析之isString》 《lodash源码分析之stringSize》

源码分析

size 用来返回类数组的长度、MapSet 的大小,或者对象自身可枚举属性的数量。

源码如下:

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

function size(collection) {
  if (collection == null) {
    return 0
  }
  if (isArrayLike(collection)) {
    return isString(collection) ? stringSize(collection) : collection.length
  }
  const tag = getTag(collection)
  if (tag == mapTag || tag == setTag) {
    return collection.size
  }
  return Object.keys(collection).length
}

处理 nullundefined

如果 collection == null ,即传入的 collectionnull 或者 undefined,直接返回 0

处理类数组

以下代码为处理类数组的代码:

if (isArrayLike(collection)) {
  return isString(collection) ? stringSize(collection) : collection.length
}

可以看到,类数组的处理也分两种情况,因为 string 其实也是类数组的一种,如果 collectionstring 类型,则使用 stringSize 来获取字符串的长度,否则直接通过 length 属性获取。

处理 MapSet

以下为处理 MapSet 的代码:

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

const tag = getTag(collection)
if (tag == mapTag || tag == setTag) {
  return collection.size
}

通过 getTag 来判断传入的 collection 是否为 Map 或者 Set 类型,如果是,则直接取其 size 属性的值。

处理对象

以下为处理对象的代码:

return Object.keys(collection).length

Object.keys 可以获取到对象所有自身可枚举的属性,取其长度即可。

License

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

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

作者:对角另一面