【问题标题】:How to check if an object is a regular object in JavaScript如何检查一个对象是否是 JavaScript 中的常规对象
【发布时间】:2018-10-05 03:02:46
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: javascript class object prototype proto


    【解决方案1】:

    除了检查原型,还可以检查其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)));

    【讨论】:

    • 得稍微修改一下你的答案,因为obj 可以是null: const isPlainObject = obj => obj && obj.constructor === Object && Object.getPrototypeOf(obj) === Object.prototype;
    【解决方案2】:

    这可能很棘手,因为某些 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 2010-09-27
      • 2016-06-05
      • 2020-03-23
      • 2022-10-01
      • 1970-01-01
      相关资源
      最近更新 更多