# isPlainObject
# Description
判断value
是否为一个纯对象,即该对象由Object
的构造函数创建,原型为Object.prototype
或者 [[Prototype]]
为 null
# Params
value
# Return
Boolean
# Depend
import getTag from './.internal/getTag.js'
import isObjectLike from './isObjectLike.js'
# Code
function isPlainObject(value) {
if (!isObjectLike(value) || getTag(value) != '[object Object]') {
return false
}
if (Object.getPrototypeOf(value) === null) {
return true
}
let proto = value
while (Object.getPrototypeOf(proto) !== null) {
proto = Object.getPrototypeOf(proto)
}
return Object.getPrototypeOf(value) === proto
}
# Analyze
调用
isObjectLike
和getTag
判断是否满足!null
&&'[object Object]'
调用
Object.getPrototypeOf(value)
, 判断是否原型为null
,如果为null
则返回true
通过
while
循环遍历整个对象的原型链,如果最顶层的原型和value
的一致,返回true
# Remark
Object.getPrototypeOf 返回指定对象的原型(proto)
Object.create(null) ,也是一个对象,原型为 null
通过 while 循环遍历,而不直接使用 Object.prototype, 是为了考虑 js 环境的问题,如 iframe 的父级和子级,他们的 Object.prototype 可能不一致
# Example
isPlainObject(null) // false
isPlainObject(Object.create(null)) // true
isPlainObject(3) // false
isPlainObject({a:1}) // true
isPlainObject(new Map()) // false
← isObjectLike isRegExp →