gpt4 book ai didi

javascript - JavaScript 中如何检查一个对象是否是常规对象

转载 作者:行者123 更新时间:2023-12-03 01:00:10 24 4
gpt4 key购买 nike

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

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

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

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

我的问题:
该对象将失去其特殊的类原型(prototype),因为我只遍历非原型(prototype)值来递归合并。

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

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

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

最佳答案

除了检查原型(prototype)之外,您还可以检查其构造函数是否为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 或未定义的内容传递给 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)));

关于javascript - JavaScript 中如何检查一个对象是否是常规对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52657814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com