es-toolkit
Version:
A state-of-the-art, high-performance JavaScript utility library with a small bundle size and strong type annotations.
40 lines (39 loc) • 1.45 kB
JavaScript
//#region src/compat/predicate/isPlainObject.ts
/**
* Checks if a given value is a plain object.
*
* A plain object is an object created by the `{}` literal, `new Object()`, or
* `Object.create(null)`.
*
* This function also handles objects with custom
* `Symbol.toStringTag` properties.
*
* `Symbol.toStringTag` is a built-in symbol that a constructor can use to customize the
* default string description of objects.
*
* @param [object] - The value to check.
* @returns True if the value is a plain object, otherwise false.
*
* @example
* console.log(isPlainObject({})); // true
* console.log(isPlainObject([])); // false
* console.log(isPlainObject(null)); // false
* console.log(isPlainObject(Object.create(null))); // true
* console.log(isPlainObject(new Map())); // false
*/
function isPlainObject(object) {
if (typeof object !== "object") return false;
if (object == null) return false;
if (Object.getPrototypeOf(object) === null) return true;
if (Object.prototype.toString.call(object) !== "[object Object]") {
const tag = object[Symbol.toStringTag];
if (tag == null) return false;
if (!Object.getOwnPropertyDescriptor(object, Symbol.toStringTag)?.writable) return false;
return object.toString() === `[object ${tag}]`;
}
let proto = object;
while (Object.getPrototypeOf(proto) !== null) proto = Object.getPrototypeOf(proto);
return Object.getPrototypeOf(object) === proto;
}
//#endregion
exports.isPlainObject = isPlainObject;