40 lines
1.4 KiB
JavaScript
40 lines
1.4 KiB
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 {any} [object] - The value to check.
|
||
|
|
* @returns {boolean} - 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;
|