前言
最近看到一篇博客写的是lodash的isObject和isPlainObject的区别,发现自己也没怎么注意这两者的使用, 于是去看了一下lodash的实现
isObject
判断非基础类型的对象,这个很简单,主要是通过typeof判断是否等于object或者function,然后再排除null。
typeof null === object 这个是一个js的历史包袱,具体原因可以参考MDN
isPlainObject
判断是否普通对象,也就是以下三种情况
- 对象字面量 {}
- new Object()
- Object.create(null)
function isPlainObject(value) {
if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
return false;
}
var proto = getPrototype(value);
if (proto === null) {
return true;
}
var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
return typeof Ctor == 'function' && Ctor instanceof Ctor &&
funcToString.call(Ctor) == objectCtorString;
}
主要分为三个步骤
- isObjectLike这个方法是和isObject差不多,只是少判断了function类型,也是通过typeof 排除基础数据类型
- baseGetTag利用 Object.prototype.tostring.call()判断是否等于[object Object]
- 此时还剩一种情况:通过构造函数new出来的对象,这个时候需要判断对象的构造函数的类型,object对象的构造函数 tostring类型是'[object Object]',自定义构造函数是 [object Function]