阅读 Lodash 的第一部分源码是关于如何可靠地判断数据类型的。
Lodash 一共有 31 个 API 用于判断数据类型,今天分析其中 3 个,另外 28 个 API 会在后续的文章中分析。
JS 中对于对象类型的判断,极为复杂,不仅需要考虑语言本身的设计问题,还需要具备原型与原型链的知识,以及 ES6 相关的储备。
在 Lodash 中提供了 isObject(), isObjectLike() 和 isPlainObject() 三个函数进行可靠地判断,它们对对象如何进行分类?背后的原理又是什么?
Part 1. isObject()
广义对象
即引用类型。引用类型是一种数据结构,用于将数据和功能组织在一起,描述的是一类对象所具有的属性和方法。
通过上面的定义,我们可以清楚对象、数组、函数、Set、Map 等都是引用类型。OK,现在我们明确了范围,那么怎样可以判断出来呢?
原生 JS 提供了 typeof 操作符,但是却存在着致命缺陷!
typeof null === 'object'
// => true
function fn() {
}
typeof fn === 'object'
// => false
null 不满足广义对象的定义,却被 typeof 判断为一个对象;另外,函数满足广义对象的定义,却无法被 typeof 判断为一个对象。
通常,我们去判断广义对象(引用类型),必须要考虑这两种情况。通过下面 isObject() 的源码可以看到,Lodash 也是这样做的:
function isObject(value) {
const type = typeof value
return value != null && (type == 'object' || type == 'function')
}
Part 2. isObjectLike()
函数有何不同?
上面我们已经知道,无法通过 typeof 来判断一个函数是一个对象&