Lodash 学习笔记(一):js 类型判断

745 阅读1分钟

Lodash 提供了30多个和js数据类型判断有关的方法。主要介绍几个通用的类型判断方法。

getTag

const toString = Object.prototype.toString

function getTag(value) {
  if (value == null) {
    return value === undefined ? '[object Undefined]' : '[object Null]'
  }
  return toString.call(value)
}

export default getTag

使用 Object.prototype.toString.call()方法获取数据的类型。这里面比较奇怪的是对 nullundefined 进行了特殊处理,有人提出 issue 讨论是否有这个必要,不过暂时还没有定论。

isArryaLike

在js中,有些对象看着像数组,但是实际上并不是。这些对象可以用索引获取对象中的值,并且有 length 属性,但是没有数组的方法(pushforEachconcat等等)。

常见的 Array-Like Object 有:

  • arguments
  • DOM node list: 使用 document.getElementsBy*()document.forms 这些方式获取的 DOM 节点列表
  • 字符串

看一下 lodash 是怎么判断对象是 Array-Like 的:

const MAX_SAFE_INTEGER = 9007199254740991

/**
 * Checks if `value` is a valid array-like length.
 * 是否是有效的类数组长度,大于等于0,小于等于MAX_SAFE_INTEGER的整数
 */
function isLength(value) {
  return typeof value === 'number' &&
    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER
}
/**
 * Checks if `value` is array-like. A value is considered array-like if it's
 * not a function and has a `value.length` that's an integer greater than or
 * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
 */
function isArrayLike(value) {
  return value != null && typeof value !== 'function' && isLength(value.length)
}

  • lodash 多判断了不是 function 这一个条件。
  • MAX_SAFE_INTEGER 可以从 Number.MAX_SAFE_INTEGER 中取,lodash 直接给出了具体的值。
  • isLength 是基于 ToLength 的。更多关于 ToLength 的信息

isObjectLike

这个是 lodash 中自创的一个概念,是判断非空对象的。这个是做代码优化时添加的PR.

function isObjectLike(value) {
  return typeof value === 'object' && value !== null
}

参考: