我知道一切都被认为是JavaScript中的一个对象。我正在创建一个函数,它特别要求它接受的参数采用这种格式:
{
a: 'b',
c: 'd'
}
因此,花括号内的这种类型的键值对排序的对象不是其他类型的对象。如何具体验证这个?
答案 0 :(得分:3)
更新:在完成以下所有内容并稍后进一步考虑之后,我建议您再看看Trevor's answer。我认为它比我的回答更值得美丽的绿色选中标记,这就是原因。
我从表面上看待你的问题然后用它来运行:如果你真的想按字面意思做你所说的话,那么像$.isPlainObject()
这样的函数就是你的选择。但真的你需要做什么?请记住,$.isPlainObject()
不是一个非常有效的功能;它枚举所有对象的属性。正如我在下面提到的,它无法区分{}
和new Object()
。
而不是所有这一切,特雷弗建议只是检查你需要的属性,在大多数情况下,大部分时间,我认为他是对的。它绝对更接近我在自己的代码中采用的方法:验证我需要的东西,忽略其余的。
所以再看看他的回答并仔细考虑一下。 (如果你移动复选标记,我不会被冒犯!)
现在我原来的回答:
jQuery中有一个$.isPlainObject()
函数。如果您不使用jQuery,可以将此功能的源代码复制到您的应用程序中。打开jQuery source并搜索isPlainObject:
。
在任何情况下都值得阅读此功能的来源,看它不像typeof
或instanceOf
检查那么简单:
isPlainObject: function( obj ) {
// Must be an Object.
// Because of IE, we also have to check the presence of the constructor property.
// Make sure that DOM nodes and window objects don't pass through, as well
if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
return false;
}
try {
// Not own constructor property must be Object
if ( obj.constructor &&
!core_hasOwn.call(obj, "constructor") &&
!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
return false;
}
} catch ( e ) {
// IE8,9 Will throw exceptions on certain host objects #9897
return false;
}
// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
var key;
for ( key in obj ) {}
return key === undefined || core_hasOwn.call( obj, key );
},
type: function( obj ) {
if ( obj == null ) {
return String( obj );
}
return typeof obj === "object" || typeof obj === "function" ?
class2type[ core_toString.call(obj) ] || "object" :
typeof obj;
},
isWindow: function( obj ) {
return obj != null && obj == obj.window;
},
此代码还使用了class2type
对象:
// [[Class]] -> type pairs
class2type = {},
// Populate the class2type map
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
});
(这些代码段不在上下文中;如果您单独使用它们,则需要调整语法。)
当然,根据具体情况,您可能不需要所有这些检查。如果你已经使用了jQuery,你可以打电话给$.isPlainObject()
,而不是出汗。
另请注意,无法区分对象文字与使用new Object
创建的对象:
var obj1 = { a:'b', c:'d' };
var obj2 = new Object();
obj2.a = 'b';
obj2.c = 'd';
console.log( $.isPlainObject(obj1) ); // prints true
console.log( $.isPlainObject(obj2) ); // also prints true!
他们都从true
返回$.isPlainObject()
,我很确定您设计的任何其他测试都无法分辨哪个是哪个。
一个有趣的历史记录:当John Resig在2009年将此功能添加到jQuery时,他最初将其称为$.isObjectLiteral()
。由于这种模棱两可的原因,我向他changed the name致$.isPlainObject
。
答案 1 :(得分:2)
在你所描述的情况下,我不会担心确定它不是不是数组或其他类型的对象。只需确保您需要的属性在那里,如果它们丢失,则发出警报。
function needAandC(params) {
if (params.a === undefined || params.c === undefined)
throw new Error('Ahhh.');
// You've got what you need, don't worry what else is there.
}
答案 2 :(得分:1)
使用typeof
var obj = {x: 1, y: 2};
if (typeof obj == 'object') console.log('im an object');
答案 3 :(得分:1)
检查value
是object
是否属性a
和c
:
var value = {a: 1, c: 2};
if (typeof value === "object" && "a" in value && "c" in value)
{
...
}
答案 4 :(得分:1)
缺陷:
typeof
数组是'对象'
typeof [] === 'object' //true
Array
是Object
Array instanceof Object //true
typeof null
是'对象'
typeof null === 'object' //true
你可以这样做,检查是否:
arg
是真的。由于null
是假的,所以它在这里被淘汰。typeof arg
是'对象'。 AFAIK,只传递数组和对象。最后,如果arg
不是Array
的实例
if(arg && typeof arg === 'object' && !(arg instanceof Array){...}
答案 5 :(得分:0)
这还取决于您要确切声明的内容。对于最常见的情况-参数(或合同)验证,我最近注意到NPM团队(https://github.com/npm/cli)依赖于https://github.com/iarna/aproba函数,该函数异常轻便且简单:
validate("O", [ val ]); // if val is not object, throws an exception
函数的作用:
var isObject = ( typeof val === 'object' && val !== null && !Array.isArray( val )
&& !( val instanceof Error ) && !isArguments( val ) );
function isArguments (thingy) {
return thingy != null && typeof thingy === 'object' && thingy.hasOwnProperty('callee')
}