loadsh中的 isPlainObject

503 阅读1分钟

前言

最近看到一篇博客写的是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;
}

主要分为三个步骤

  1. isObjectLike这个方法是和isObject差不多,只是少判断了function类型,也是通过typeof 排除基础数据类型
  2. baseGetTag利用 Object.prototype.tostring.call()判断是否等于[object Object]
  3. 此时还剩一种情况:通过构造函数new出来的对象,这个时候需要判断对象的构造函数的类型,object对象的构造函数 tostring类型是'[object Object]',自定义构造函数是 [object Function]