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()方法获取数据的类型。这里面比较奇怪的是对 null 和 undefined 进行了特殊处理,有人提出 issue 讨论是否有这个必要,不过暂时还没有定论。
isArryaLike
在js中,有些对象看着像数组,但是实际上并不是。这些对象可以用索引获取对象中的值,并且有 length 属性,但是没有数组的方法(push、forEach、concat等等)。
常见的 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
}
参考: