To accurately check if a value is an object in JavaScript, the method Object.getPrototypeOf() can provide a more reliable approach. Here's why it matters and how to use it effectively.
Why typeof is Not Enough
Traditionally, developers use typeof to check if a value is an object:
console.log(typeof {}); // "object"
console.log(typeof []); // "object"
console.log(typeof null); // "object" (which is misleading)
While typeof works for most basic checks, it has some shortcomings:
- It returns
"object"fornull, which is not actually an object. - It doesn't differentiate between various types of objects (plain objects, arrays, etc.).
Using Object.getPrototypeOf() for More Accurate Checks
The Object.getPrototypeOf() method returns the prototype (or [[Prototype]]) of the specified object. This allows for more precise object detection and differentiation between object types.
Basic Usage:
const obj = {};
console.log(Object.getPrototypeOf(obj) === Object.prototype); // true
Check if a Value is a Plain Object:
A "plain object" is an object created using object literal {} or new Object(). To check if a value is a plain object:
function isPlainObject(value) {
return Object.getPrototypeOf(value) === Object.prototype;
}
console.log(isPlainObject({})); // true
console.log(isPlainObject(new Object())); // true
console.log(isPlainObject([])); // false
console.log(isPlainObject(null)); // false
Differentiating Between Arrays, Functions, and Other Objects:
Using Object.getPrototypeOf(), you can also distinguish between different object types:
console.log(Object.getPrototypeOf([]) === Array.prototype); // true (array)
console.log(Object.getPrototypeOf(() => {}) === Function.prototype); // true (function)
Advantages of Object.getPrototypeOf():
- Accurate Object Checking: It allows you to check whether a value is a plain object, array, or function without ambiguity.
- Improved Readability: Using
Object.getPrototypeOf()makes it clearer what type of object you're working with.
Example: Full Object Type Check
Here’s a utility function that checks whether a value is an object and whether it’s a specific type of object:
function getTypeOfObject(value) {
if (value === null || typeof value !== 'object') return typeof value;
const prototype = Object.getPrototypeOf(value);
if (prototype === Object.prototype) return 'Plain Object';
if (prototype === Array.prototype) return 'Array';
if (prototype === Function.prototype) return 'Function';
return 'Other Object';
}
console.log(getTypeOfObject({})); // "Plain Object"
console.log(getTypeOfObject([])); // "Array"
console.log(getTypeOfObject(() => {})); // "Function"
console.log(getTypeOfObject(null)); // "null"
Conclusion:
Using Object.getPrototypeOf() provides a more robust and precise way to check if a value is an object, making it ideal for advanced type checking in JavaScript.