# isPlainObject

用于判断对象是否为对象字面量new Object创建的无格式对象。即对象的原型为Object

export default function isPlainObject(obj) {
  if (typeof obj !== 'object' || obj === null) return false

  let proto = obj
  while (Object.getPrototypeOf(proto) !== null) {
    proto = Object.getPrototypeOf(proto)
  }

  return Object.getPrototypeOf(obj) === proto
}

这一段代码的作用如下:

proto对象从当前层级开始寻找,直到寻找到原型链的顶端,即Object

Object.getPrototypeOf(obj)只寻找父级原型链。

那么会出现以下情况:

  • obj是无格式对象,它的父级就是Object,而proto也是Object,返回true
  • obj不是无格式对象,例如函数,那么它的父级就为Function,而protoObject,返回false

因为无格式对象的原型链层级必定是1,来判断对象是否为无格式对象。

Object.getPrototypeOf(proto)是ES6新增的语法。

之前调用方式为:proto.__proto__,现在熟悉了吗?

最近更新时间: 2020/9/6 11:30:38