# size

# Description

返回 collection(集合)的长度,如果集合是类数组或字符串,返回其 length ;如果集合是对象,返回其可枚举属性的个数。'

# Params

collection

# Return

Number

# Depend

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

getTag 源码分析

isArrayLike 源码分析

isString 源码分析

stringSize 源码分析

# Code

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
}

# Analyze

# null 和 undefined

  if (collection == null) {
    return 0
  }

如果是 null 和 undefined ,则返回 0

# 类数组和字符串

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

string 也可以通过 isArrayLike 的校验,如果是 string 类型,则使用 stringSize 拿到长度,否则返回 collection.length

# Map 和 Set

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

MapSet 返回 size 即可

# 对象

  return Object.keys(collection).length

通过 Object.keys 拿到可枚举属性数组,返回数组的 length

# Example

console.log(size('abc')) // 3
console.log(size([1,2,3])) // 3
console.log(size({a:1, b:2, c:3})) // 3