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