isPlainObject.js

import getTag from './internals/getTag';
import { functionProtoToString, objectProtoHasOwnProperty, objectGetPrototypeOf, objectTag } from './internals/native';
import isObjectLike from './isObjectLike';
const objectCtorString = functionProtoToString.call(Object);
/**
 * 检查值是否为普通对象,即由 `Object` 构造函数创建或 `[[Prototype]]` 为 `null` 的对象。
 *
 * @alias module:Language.isPlainObject
 * @since 1.0.0
 * @param {*} value 要检查的值。
 * @returns {boolean} 如果值为普通对象,返回 `true`,否则返回 `false`。
 * @example
 *
 * function Foo(){
 *   this.a = 1;
 * }
 *
 * isPlainObject(new Foo); // false
 *
 * isPlainObject([1,2,3]); // false
 *
 * isPlainObject({ a: 1, b: 2 }); // true
 *
 * isPlainObject(Object.create(null)); // true
 *
 */
function isPlainObject(value) {
    if (!isObjectLike(value) || getTag(value) !== objectTag) {
        return false;
    }
    const proto = objectGetPrototypeOf(Object(value));
    // Object.create(null)
    if (proto === null) {
        return true;
    }
    const Ctor = objectProtoHasOwnProperty.call(proto, 'constructor') && proto.constructor;
    // 这里如果直接比较 proto.constructor === Object ,iframe 嵌套会导致结果不准确。
    return typeof Ctor === 'function' && Ctor instanceof Ctor && functionProtoToString.call(Ctor) === objectCtorString;
}
export default isPlainObject;