JavaScript 如何检查对象是否为常规对象
How to check if an object is a regular object in JavaScript
我创建了一个 a merging library that merges objects recursively. Sometimes in the middle there would be an object that is actually a special class (like the Timestamp 的 Firestore)。
在我的合并函数中,我检查某物是否是一个对象,就像这样:
function isObject (payload) {
const getType = Object.prototype.toString.call(payload).slice(8, -1)
return getType === 'Object'
}
但是,通过此检查,一些具有特殊原型的特殊 classes 仍被视为常规 JavaScript 对象。
我的问题:
该对象将失去其特殊的 class 原型,因为我只通过非原型值进行递归合并。
我的问题:
我怎样才能改变上面的函数,不仅检查它是否是一个 JavaScript 对象,而且检查它是否是一个常规JavaScript对象?
基本上我只想在 isObject(obj)
上 return true
如果 obj
是这样的对象:{}
或任何道具。
但是一旦原型不同(因此它是一个特殊的 class),那么我想 return false
on isObject(obj)
除了检查原型,你还可以检查它的constructor
是否是Object
:
const isPlainObject = obj => obj.constructor === Object && Object.getPrototypeOf(obj) === Object.prototype;
const obj1 = { foo: 'bar' };
const obj2 = new Date();
const obj3 = [];
[obj1, obj2, obj3].forEach(obj => console.log(isPlainObject(obj)));
请注意,使用 getPrototypeOf
并检查它是 ===
到 Object.prototype
比使用 toString
- toString
更可靠 return 无论如何。
如果您可能将 null 或未定义的内容传递给 isPlainObject
,那么在尝试访问其属性之前,当然包括检查以查看 obj
是否为真:
const isPlainObject = obj => obj && obj.constructor === Object && Object.getPrototypeOf(obj) === Object.prototype;
const obj1 = { foo: 'bar' };
const obj2 = new Date();
const obj3 = [];
[obj1, obj2, obj3].forEach(obj => console.log(isPlainObject(obj)));
这可能很棘手,因为某些 javascript 类型具有如下所示的 typeof
"object"
console.log(typeof []) // object
console.log(typeof null) // object
检查普通对象的一种简单方法是利用对象的 toString
方法并像这样
验证 null
/**@return boolean */
function isObject(val) {
const _toString = Object.prototype.toString;
return val !== null && _toString.call(val) === '[object Object]';
}
现在我们测试这个
isObject({}); // true
isObject({a: 2, b: 3}); // true
isObject(null); // false
isObject([]); // false
isObject(new Object()); // true
isObject(new Array()); // false
我创建了一个 a merging library that merges objects recursively. Sometimes in the middle there would be an object that is actually a special class (like the Timestamp 的 Firestore)。
在我的合并函数中,我检查某物是否是一个对象,就像这样:
function isObject (payload) {
const getType = Object.prototype.toString.call(payload).slice(8, -1)
return getType === 'Object'
}
但是,通过此检查,一些具有特殊原型的特殊 classes 仍被视为常规 JavaScript 对象。
我的问题:
该对象将失去其特殊的 class 原型,因为我只通过非原型值进行递归合并。
我的问题:
我怎样才能改变上面的函数,不仅检查它是否是一个 JavaScript 对象,而且检查它是否是一个常规JavaScript对象?
基本上我只想在 isObject(obj)
上 return true
如果 obj
是这样的对象:{}
或任何道具。
但是一旦原型不同(因此它是一个特殊的 class),那么我想 return false
on isObject(obj)
除了检查原型,你还可以检查它的constructor
是否是Object
:
const isPlainObject = obj => obj.constructor === Object && Object.getPrototypeOf(obj) === Object.prototype;
const obj1 = { foo: 'bar' };
const obj2 = new Date();
const obj3 = [];
[obj1, obj2, obj3].forEach(obj => console.log(isPlainObject(obj)));
请注意,使用 getPrototypeOf
并检查它是 ===
到 Object.prototype
比使用 toString
- toString
更可靠 return 无论如何。
如果您可能将 null 或未定义的内容传递给 isPlainObject
,那么在尝试访问其属性之前,当然包括检查以查看 obj
是否为真:
const isPlainObject = obj => obj && obj.constructor === Object && Object.getPrototypeOf(obj) === Object.prototype;
const obj1 = { foo: 'bar' };
const obj2 = new Date();
const obj3 = [];
[obj1, obj2, obj3].forEach(obj => console.log(isPlainObject(obj)));
这可能很棘手,因为某些 javascript 类型具有如下所示的 typeof
"object"
console.log(typeof []) // object
console.log(typeof null) // object
检查普通对象的一种简单方法是利用对象的 toString
方法并像这样
null
/**@return boolean */
function isObject(val) {
const _toString = Object.prototype.toString;
return val !== null && _toString.call(val) === '[object Object]';
}
现在我们测试这个
isObject({}); // true
isObject({a: 2, b: 3}); // true
isObject(null); // false
isObject([]); // false
isObject(new Object()); // true
isObject(new Array()); // false