我正在寻找快速检查来确定这个
function isPlainObject(input){
return !Array.isArray(input) && typeof input === 'object'
}
是否有一个较短的检查,我可以用来确定输入是这样的
{}
但不是数组
[]
或其他可能仍以结帐'对象'?
结帐的结构
答案 0 :(得分:5)
检查虚拟值(例如null
是一个对象)不是更快,而是更精确。
function isPlainObject(input){
return input && !Array.isArray(input) && typeof input === 'object';
}
答案 1 :(得分:3)
如果你想检查对象是否是"普通"对象,即直接从 Object.prototype 继承,那么你应该检查它。
E.g。以下第一次测试是否值在其原型链的任何地方都有 Object (因此不会为 getPrototypeOf 引发错误),然后检查它的直接[[prototype]]
是否是 Object.prototype :
function isPlainObject(value) {
return value instanceof Object &&
Object.getPrototypeOf(value) == Object.prototype;
}
// Some tests
[[1,2], // Array
{}, // Plain object
null, // null
document.createElement('div'), // host object
function(){}, // function object
console // host objet
].forEach(function(value) {
console.log(value + ': ' + isPlainObject(value));
});

如果你想测试输入是某个扩展对象而不是功能等,效率低得多,例如针对您要避免的某些对象列表进行测试:
function isJustObj(obj) {
var notThese = [Function, Array, Date];
if (obj instanceof Object) {
return !notThese.some(function(o) {
return obj instanceof o;
});
}
return false;
}
function Foo(){}
var tests = {'Array: ':[],
'Object: ' : {},
'Foo instance:' : new Foo(),
'Function: ' : function(){},
'Date: ' : new Date(),
'Host obj: ' : document.createElement('div')
};
Object.keys(tests).forEach(function(test) {
console.log(test + isJustObj(tests[test]));
})

请注意,此策略会查看该值是否为某种Object,然后测试它是否是特定构造函数集的实例。这个要排除的事物列表可能变得非常大,因为它不可能以任何合理的方式排除主机对象,这些主机本质上可以根据一些常规测试与内置对象无法区分(参见{ {3}})。
E.g。
console.log instanceof Function // true
console instanceof Object // true
isPlainObject(console) // false
因此,您要么检查Object.prototype是否是直接[[Prototype]]
,要么创建一个要测试的长构造函数列表。鉴于可用的主机环境多种多样,以及实现者扩展它的自由,该列表将很快过时。此外,您需要在尝试使用它之前测试主机对象集的每个成员,因为对于运行代码的特定主机,它可能不存在。
答案 2 :(得分:1)
Javascript数组被认为是对象,因此在数组的情况下,typeof将始终是对象。