如何检查对象是否为 "plain" 对象?

How can I check whether an object is a "plain" object?

我不确定这个问题的正确术语是什么,所以我会尽力解释。

JavaScript 中的很多东西都是对象,例如数组和 class 实例。

typeof {"a": 3}     // "object"
typeof (new foo())  // "object"
tyepof [1, 2, 3]    // "object"

如果你有一个接受对象的函数,你如何检查该对象是否是像上面那个那样的“普通”对象,例如不是 class 的实例化、错误等,而只是一个普通对象?

我试过检查原型,但我无法始终如一地确定一个对象是某个对象的实例化还是一个数组或类似的对象,还是一个普通对象。

如有任何帮助,我们将不胜感激。

我不知道这是否是一个全面的解决方案,但您可以对照 constructor 属性:

function foo() {}
class Bar {}

console.log(
  {}.constructor === Object, // this is the "plain" object
  [].constructor === Object,
  ''.constructor === Object,
  (new foo()).constructor === Object,
  (new Bar()).constructor === Object,
  (new Map()).constructor === Object,
  (new Set()).constructor === Object,
  (new WeakMap()).constructor === Object,
  (new WeakSet()).constructor === Object,
  (new Error()).constructor === Object,
);

(编辑:我想不出任何其他类型的对象)