如何检查对象是否是JavaScript中的常规对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检查对象是否是JavaScript中的常规对象相关的知识,希望对你有一定的参考价值。

我有一个创建的a merging library递归合并对象。有时在中间会有一个实际上是特殊类的对象(比如Firestore的Timestamp)。

在我的合并函数中,我检查是否有某个对象是这样的:

function isObject (payload) {
  const getType = Object.prototype.toString.call(payload).slice(8, -1)
  return getType === 'Object'
}

但是,通过此检查,一些具有特殊原型的特殊类仍被视为常规javascript对象。

我的问题: 该对象将失去其特殊的类原型,因为我只通过非原型值进行递归合并。

我的问题: 如何更改上面的函数,不仅检查它是否是JavaScript对象,还检查它是否是常规JavaScript对象?

基本上我只想在true上返回isObject(obj),如果obj是这样的对象:{}或任何道具。

但是一旦原型不同(因此它是一个特殊的类),那么我想在false上返回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)));
另一答案

它可能很棘手,因为一些javascript类型有一个像下面的typeof“对象”

console.log(typeof []) // object
console.log(typeof null) // object

检查普通对象的一种简单方法是使用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

以上是关于如何检查对象是否是JavaScript中的常规对象的主要内容,如果未能解决你的问题,请参考以下文章

如何检查获取的响应是不是是javascript中的json对象

如何根据 JavaScript 中的值检查对象是不是在数组中?

如何检查一个对象是不是至少包含一个键,其值包含 JavaScript 中的子字符串?

如何检查对象内的数组是不是为空 JavaScript

如何检查javascript中的对象中是不是存在键[重复]

在javascript中搜索对象中的值[关闭]