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

时间:2018-10-05 03:02:47

标签: javascript class object prototype proto

我有一个创建的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)

2 个答案:

答案 0 :(得分:2)

除了检查原型之外,您还可以检查其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可以返回任何内容。

如果您可能要将空值或未定义的值传递给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)));

答案 1 :(得分:-1)

可能有些技巧,因为某些javascript类型具有如下的typeof“对象”

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