# 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,而proto为Object,返回false。
因为无格式对象的原型链层级必定是1,来判断对象是否为无格式对象。
Object.getPrototypeOf(proto)是ES6新增的语法。之前调用方式为:
proto.__proto__,现在熟悉了吗?