0

我创建了一个递归合并对象的合并库。有时在中间会有一个实际上是一个特殊类的对象(如 Firestore 的时间戳)。

在我的合并函数中,我检查某物是否是对象:

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

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

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

我的问题:
我怎样才能改变上面的函数,不仅检查它是否是一个 JavaScript 对象,而且检查它是否是一个普通的 JavaScript 对象

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

false但是一旦原型不同(因此它是一个特殊的类),那么我想返回isObject(obj)

4

2 回答 2

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毕竟可能会返回任何东西。

如果您可能将 null 或 undefined 的内容传递给,那么在尝试访问其属性之前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)));

于 2018-10-05T03:06:03.800 回答
0

这可能很棘手,因为某些 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
于 2018-10-05T03:15:56.273 回答