Check if a value is an object in JavaScript
如何检查值是否是javascript中的对象?
如果
让我们在javascript中定义"对象"。根据MDN文档,每个值都是一个对象或原语:
primitive, primitive value
A data that is not an object and does not have any methods. JavaScript has 5 primitive datatypes: string, number, boolean, null, undefined.
什么是原始人?
3 'abc' true null undefined
什么是物体(即不是原始物体)?
Object.prototype - 一切都是从
Object.prototype 传下来的。Function.prototype Object Function function C(){} 用户定义函数
C.prototype 用户定义函数的原型属性:这不是C 的原型new C() -"新"—使用用户定义函数
Math Array.prototype - 数组
{"a": 1,"b": 2} —使用文字符号创建的对象new Number(3) ——原语包装纸- …其他很多事情…
Object.create(null) - 一切都是从一个
Object.create(null) 衍生而来的。
如何检查值是否为对象
1 2 3 4 5 | // oops: isObject(Object.prototype) -> false // oops: isObject(Object.create(null)) -> false function isObject(val) { return val instanceof Object; } |
由于假阳性(
1 2 3 4 | // oops: isObject(Object) -> false function isObject(val) { return (typeof val === 'object'); } |
1 2 3 4 5 | > Object.prototype.toString.call(3) "[object Number]" > Object.prototype.toString.call(new Number(3)) "[object Number]" |
所以我用:
1 2 3 4 | function isObject(val) { if (val === null) { return false;} return ( (typeof val === 'function') || (typeof val === 'object') ); } |
@达安的回答似乎也有效:
1 2 3 | function isObject(obj) { return obj === Object(obj); } |
因为,根据MDN文档:
The Object constructor creates an object wrapper for the given value. If the value is null or undefined, it will create and return an empty object, otherwise, it will return an object of a type that corresponds to the given value. If the value is an object already, it will return the value.
第三种似乎有效的方法(不确定是否为100%)是使用
1 2 3 4 5 6 7 8 9 10 11 12 13 | // these 5 examples throw exceptions Object.getPrototypeOf(null) Object.getPrototypeOf(undefined) Object.getPrototypeOf(3) Object.getPrototypeOf('abc') Object.getPrototypeOf(true) // these 5 examples don't throw exceptions Object.getPrototypeOf(Object) Object.getPrototypeOf(Object.prototype) Object.getPrototypeOf(Object.create(null)) Object.getPrototypeOf([]) Object.getPrototypeOf({}) |
尝试使用
编辑:这个答案给出了如何检查变量属性的概念,但它不是一个防弹配方(毕竟根本没有配方!)检查它是否是一个物体,远离它。因为人们往往在不做任何研究的情况下从这里寻找可以复制的东西,所以我强烈建议他们转向另一个最上乘的人(并且是正确的!)回答。
official underline.js使用此检查来确定某个东西是否真的是一个对象
1 2 3 4 | // Is a given variable an object? _.isObject = function(obj) { return obj === Object(obj); }; |
更新
更新后的underline.js库现在正在使用以下功能,因为V8中以前有一个bug,并且还有一些微速度优化。
1 2 3 4 5 | // Is a given variable an object? _.isObject = function(obj) { var type = typeof obj; return type === 'function' || type === 'object' && !!obj; }; |
- 如果myvar是一个对象,则为
"[object Object]" 。 - 如果myvar是一个数组,则为
"[object Array]" 。 - 等。
有关这方面的更多信息以及为什么它是typeof的一个很好的替代方法,请阅读本文。
用于简单地检查对象或数组,而不需要额外的函数调用(速度)。也张贴在这里。
ISARAY()
1 2 3 4 5 6 7 8 9 10 11 | isArray = function(a) { return (!!a) && (a.constructor === Array); }; console.log(isArray( )); // false console.log(isArray( null)); // false console.log(isArray( true)); // false console.log(isArray( 1)); // false console.log(isArray( 'str')); // false console.log(isArray( {})); // false console.log(isArray(new Date)); // false console.log(isArray( [])); // true |
isObject()-注意:仅用于对象文本,因为它对自定义对象(如new date或new yourcustomObject)返回false。
1 2 3 4 5 6 7 8 9 10 11 | isObject = function(a) { return (!!a) && (a.constructor === Object); }; console.log(isObject( )); // false console.log(isObject( null)); // false console.log(isObject( true)); // false console.log(isObject( 1)); // false console.log(isObject( 'str')); // false console.log(isObject( [])); // false console.log(isObject(new Date)); // false console.log(isObject( {})); // true |
我喜欢简单的:
1 2 3 | function isObject (item) { return (typeof item ==="object" && !Array.isArray(item) && item !== null); } |
如果该项是JS对象,并且不是JS数组,也不是
文档:
http://devdocs.io/javascript/operators/typeof
http://devdocs.io/javascript/global_对象/object
http://devdocs.io/javascript/global_objects/array/isarray
http://devdocs.io/javascript/global_对象/null
具有
1 2 3 | function isObject(o) { return o !== null && typeof o === 'object' && Array.isArray(o) === false; } |
无功能
只是奇怪有多少人对错误的答案投了赞成票??只有一个答案通过了我的测试!!!!这里我创建了我的简化版本:
1 2 3 | function isObject(o) { return o instanceof Object && o.constructor === Object; } |
对于我来说,这很简单明了,而且很有效!这里是我的测试:
1 2 3 4 5 | console.log(isObject({})); // Will return: true console.log(isObject([])); // Will return: false console.log(isObject(null)); // Will return: false console.log(isObject(/.*/)); // Will return: false console.log(isObject(function () {})); // Will return: false |
再一次:并非所有答案都通过了这项测试!!!!???
如果需要验证对象是特定类的实例,则必须使用特定类检查构造函数,例如:
1 2 3 | function isDate(o) { return o instanceof Object && o.constructor === Date; } |
简单测试:
1 2 3 | var d = new Date(); console.log(isObject(d)); // Will return: false console.log(isDate(d)); // Will return: true |
因此,您将拥有严格而健壮的代码!
如果不创建
1 2 3 | function isObject(o) { return o instanceof Object && typeof o.constructor === 'function'; } |
它不能适用于前面提到的所有测试用例,但对于所有对象(普通的或构造的)来说已经足够好了。
由于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | function isObject(o, strict = true) { if (o === null || o === undefined) { return false; } const instanceOfObject = o instanceof Object; const typeOfObject = typeof o === 'object'; const constructorUndefined = o.constructor === undefined; const constructorObject = o.constructor === Object; const typeOfConstructorObject = typeof o.constructor === 'function'; let r; if (strict === true) { r = (instanceOfObject || typeOfObject) && (constructorUndefined || constructorObject); } else { r = (constructorUndefined || typeOfConstructorObject); } return r; }; |
基于此实现,已经在NPM v1上创建了包!它适用于所有前面描述的测试用例!???
好吧,在回答问题之前,让我们先给你这个概念,在javascript中,函数是object,也有null,object,array,even date,所以正如你所看到的,没有一个简单的方法像typeof obj==‘object’,所以上面提到的一切都将返回true,但是有一些方法可以通过编写函数或使用javascript框架来检查它。S,OK:
现在,假设您有一个真正的对象(不是空值、函数或数组):
1 | var obj = {obj1: 'obj1', obj2: 'obj2'}; |
纯javascript:
1 2 3 4 | //that's how it gets checked in angular framework function isObject(obj) { return obj !== null && typeof obj === 'object'; } |
或
1 2 3 4 | //make sure the second object is capitalised function isObject(obj) { return Object.prototype.toString.call(obj) === '[object Object]'; } |
或
1 2 3 | function isObject(obj) { return obj.constructor.toString().indexOf("Object") > -1; } |
或
1 2 3 | function isObject(obj) { return obj instanceof Object; } |
通过调用这些函数,您可以在代码中简单地使用它们中的一个,如果它是一个对象,它将返回true:
1 | isObject(obj); |
如果您使用的是一个javascript框架,那么他们通常为您准备了这类功能,其中包括:
jQuery:
1 2 | //It returns 'object' if real Object; jQuery.type(obj); |
Angular:
1 | angular.isObject(obj); |
下划线和阴影:
1 2 | //(NOTE: in Underscore and Lodash, functions, arrays return true as well but not null) _.isObject(obj); |
这取决于你所说的"是一个物体"。如果你想要所有不是原始的东西,例如你可以设置新属性的东西,这应该可以做到:
1 2 3 | function isAnyObject(value) { return value != null && (typeof value === 'object' || typeof value === 'function'); } |
它不包括原语(普通数字/
如果您想知道某个对象是"普通"对象,即它是作为文字
1 2 3 4 5 6 7 8 | function isPlainObject(value) { if (Object.prototype.toString.call(value) !== '[object Object]') { return false; } else { var prototype = Object.getPrototypeOf(value); return prototype === null || prototype === Object.prototype; } } |
edit 2018:由于
检查值类型的最合理方法似乎是
- 返回
null 的"object" ,属于空类型。 - 它为属于对象类型的可调用对象返回
"function" 。 - 它可以返回(几乎)任何它想要的非标准非可调用对象。例如,Ie似乎喜欢
"unknown" 。唯一禁止的结果是"function" 和原始类型。
因此,我建议的方法不是
Object 构造函数Object 构造函数将传递的参数强制为对象。如果它已经是一个对象,则返回相同的对象。因此,可以使用它将值强制为对象,并严格地将该对象与原始值进行比较。
以下功能需要ecmascript 3,它引入了
=== :1
2
3function isObject(value) { /* Requires ECMAScript 3 or later */
return Object(value) === value;
}我喜欢这种方法,因为它简单且自我描述,类似的检查也适用于布尔值、数字和字符串。然而,要知道,它依赖的是全球的
Object ,既不隐藏也不改变。构造函数
当您实例化一个构造函数时,它可以返回一个不同于刚刚创建的实例的值。但除非该值是一个对象,否则它将被忽略。
以下函数需要ECMAScript 3,这允许构造函数返回非对象。在ecmascript 3之前,它抛出了一个错误,但当时
try 语句并不存在。1
2
3function isObject(value) { /* Requires ECMAScript 3 or later */
return new function() { return value; }() === value;
}虽然比前一个例子简单一些,但这个例子不依赖任何全局属性,因此可能是最安全的。
this 值旧的ecmascript规范要求
this 值是一个对象。ecmascript 3引入了Function.prototype.call ,允许调用具有任意this 值的函数,但强制调用对象。ECMAScript 5引入了一种严格的模式,消除了这种行为,但在草率的模式下,我们仍然可以(但可以说不应该)依赖它。
1
2
3function isObject(value) { /* Requires ECMAScript 3 or later in sloppy mode */
return function() { return this === value; }.call(value);
}[原型]
所有普通对象都有一个名为[[原型]]的内部槽,其值决定了它从哪个其他对象继承。该值只能是一个对象或
null 。因此,您可以尝试创建从所需值继承的对象,并检查它是否工作。Object.create 和Object.getPrototypeOf 都需要ECMAScript 5。1
2
3
4
5
6
7
8function isObject(value) { /* Requires ECMAScript 5 or later */
try {
Object.create(value);
return value !== null;
} catch(err) {
return false;
}
}1
2
3
4
5function isObject(value) { /* Requires ECMAScript 5 or later */
function Constructor() {}
Constructor.prototype = value;
return Object.getPrototypeOf(new Constructor()) === value;
}一些新的ecmascript 6方法
ECMAScript 6引入了一些新的间接方法来检查值是否是一个对象。他们使用前面看到的方法将值传递给一些代码,这些代码需要包装在
try 语句中的对象来捕获错误。一些隐藏的例子,不值得评论1
2
3
4
5
6
7
8function isObject(value) { /* Requires ECMAScript 6 or later */
try {
Object.setPrototypeOf({}, value);
return value !== null;
} catch(err) {
return false;
}
}1
2
3
4
5
6
7
8function isObject(value) { /* Requires ECMAScript 6 or later */
try {
new WeakSet([value]);
return true;
} catch(err) {
return false;
}
}
注:我故意跳过了一些方法,如
天哪,其他答案太过混乱了。
简短回答
要测试这一点,只需在chrome控制台中运行以下语句。
案例1。
1 2 | var anyVar = {}; typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array) // true |
案例2。
1 2 | anyVar = []; typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array) // false |
案例3。
1 2 | anyVar = null; typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array); // false |
解释
好吧,我们把它分解一下
请转鼓!
通过这个,您可能已经学会了如何在javascript中检查数组。
试试这个
1 2 3 4 5 6 | if (objectName instanceof Object == false) { alert('Not an object'); } else { alert('An object'); } |
准备好使用功能进行检查
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | function isObject(o) { return null != o && typeof o === 'object' && Object.prototype.toString.call(o) === '[object Object]'; } function isDerivedObject(o) { return !isObject(o) && null != o && (typeof o === 'object' || typeof o === 'function') && /^\[object /.test(Object.prototype.toString.call(o)); } // Loose equality operator (==) is intentionally used to check // for undefined too // Also note that, even null is an object, within isDerivedObject // function we skip that and always return false for null |
解释
在javascript中,
null 、Object 、Array 、Date 和function 都是对象。不过,null 有点做作。所以,最好先检查一下null ,以检测它不是空的。检查
typeof o === 'object' 可以保证o 是一个对象。如果没有这张支票,Object.prototype.toString 将毫无意义,因为它将返回所有对象,即使是undefined 和null !例如:toString(undefined) 返回[object Undefined] !在
typeof o === 'object' 检查之后,toString.call(o)是检查o 是否为对象、派生对象(如Array 、Date 或function 的一种很好的方法。在
isDerivedObject 函数中,它检查o 是否为函数。因为,函数也是一个对象,这就是它存在的原因。如果不这样做,函数将返回为false。示例:isDerivedObject(function() {}) 将返回false ,但现在返回true 。人们总是可以更改对象的定义。所以,我们可以相应地改变这些函数。
测验
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | function isObject(o) { return null != o && typeof o === 'object' && Object.prototype.toString.call(o) === '[object Object]'; } function isDerivedObject(o) { return !isObject(o) && null != o && (typeof o === 'object' || typeof o === 'function') && /^\[object /.test(Object.prototype.toString.call(o)); } // TESTS // is null an object? console.log( 'is null an object?', isObject(null) ); console.log( 'is null a derived object?', isDerivedObject(null) ); // is 1234 an object? console.log( 'is 1234 an object?', isObject(1234) ); console.log( 'is 1234 a derived object?', isDerivedObject(1234) ); // is new Number(1234) an object? console.log( 'is new Number(1234) an object?', isObject(new Number(1234)) ); console.log( 'is new Number(1234) a derived object?', isDerivedObject(1234) ); // is function object an object? console.log( 'is (new (function (){})) an object?', isObject((new (function (){}))) ); console.log( 'is (new (function (){})) a derived object?', isObject((new (function (){}))) ); // is {} an object? console.log( 'is {} an object?', isObject({}) ); console.log( 'is {} a derived object?', isDerivedObject({}) ); // is Array an object? console.log( 'is Array an object?', isObject([]) ) console.log( 'is Array a derived object?', isDerivedObject([]) ) // is Date an object? console.log( 'is Date an object?', isObject(new Date()) ); console.log( 'is Date a derived object?', isDerivedObject(new Date()) ); // is function an object? console.log( 'is function an object?', isObject(function(){}) ); console.log( 'is function a derived object?', isDerivedObject(function(){}) ); |
1 2 3 4 5 6 7 8 9 10 11 12 | var a = [1] typeof a //"object" a instanceof Object //true a instanceof Array //true var b ={a: 1} b instanceof Object //true b instanceof Array //false var c = null c instanceof Object //false c instanceof Array //false |
我被要求提供更多细节。检查变量是否为对象的最清晰易懂的方法是
不幸的是,array和null都有一个
所以解决方案是:
1 2 3 | if (myVar instanceof Object && !(myVar instanceof Array)) { // code for objects } |
晚了一点…对于"普通对象"(我的意思是,如'x':5,'y':7),我有一个小片段:
1 2 3 4 5 | function isPlainObject(o) { return ((o === null) || Array.isArray(o) || typeof o == 'function') ? false :(typeof o == 'object'); } |
它生成下一个输出:
1 2 3 4 5 6 7 8 9 | console.debug(isPlainObject(isPlainObject)); //function, false console.debug(isPlainObject({'x': 6, 'y': 16})); //literal object, true console.debug(isPlainObject(5)); //number, false console.debug(isPlainObject(undefined)); //undefined, false console.debug(isPlainObject(null)); //null, false console.debug(isPlainObject('a')); //string, false console.debug(isPlainObject([])); //array?, false console.debug(isPlainObject(true)); //bool, false console.debug(isPlainObject(false)); //bool, false |
它总是对我有用。只有当"o"的类型为"object"但没有空值、数组或函数时,if才会返回"true"。:)
返回类型
类型化的javascript构造函数和对象(包括
1 | console.log(typeof null, typeof [], typeof {}) |
检查它们的
1 2 3 | console.log(({}).constructor) // returns a function with name"Object" console.log(([]).constructor) // returns a function with name"Array" console.log((null).constructor) //throws an error because null does not actually have a property |
1 2 3 | console.log(({}).constructor.name) // returns"Object" console.log(([]).constructor.name) // returns"Array" console.log((null).constructor.name) //throws an error because null does not actually have a property |
1 2 3 4 5 6 7 8 9 | function isAnObject(obj) { if(obj==null) return false; return obj.constructor.name.toLowerCase() ==="object" } console.log(isAnObject({})) // return true console.log(isAnObject([])) // returns false console.log(isAnObject(null)) // return false |
Note: Function.name might not work in IE https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#Browser_compatibility
洛达什有isplainObject,这可能是许多人来这个页面寻找的。当给出一个函数或数组时,它返回false。
由于对于如何正确处理这个问题似乎有很多困惑,我将留下2美分(这个答案符合规范,在任何情况下都会产生正确的结果):
测试原语:
1 | function isPrimitive(o){return typeof o!=='object'||null} |
对象不是基元:
1 | function isObject(o){return !isPrimitive(o)} |
或者:
1 2 | function isObject(o){return o instanceof Object} function isPrimitive(o){return !isObject(o)} |
测试任何阵列:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | const isArray=(function(){ const arrayTypes=Object.create(null); arrayTypes['Array']=true; arrayTypes['Int8Array']=true; arrayTypes['Uint8Array']=true; arrayTypes['Uint8ClampedArray']=true; arrayTypes['Int16Array']=true; arrayTypes['Uint16Array']=true; arrayTypes['Int32Array']=true; arrayTypes['Uint32Array']=true; arrayTypes['Float32Array']=true; arrayTypes['Float64Array']=true; return function(o){ if (!o) return false; return !isPrimitive(o)&&!!arrayTypes[o.constructor.name]; } }()); |
测试对象不包括:
1 2 3 4 5 6 7 8 9 10 11 12 13 | const isObjectStrict=(function(){ const nativeTypes=Object.create(null); nativeTypes['Date']=true; nativeTypes['RegExp']=true; nativeTypes['Boolean']=true; nativeTypes['Number']=true; nativeTypes['String']=true; nativeTypes['Function']=true; return function(o){ if (!o) return false; return !isPrimitive(o)&&!isArray(o)&&!nativeTypes[o.constructor.name]; } }()); |
这是可行的。它是一个返回真、假或可能为空的函数。
1 2 3 4 5 6 7 | const isObject = obj => obj && obj.constructor && obj.constructor === Object; console.log(isObject({})); // true console.log(isObject([])); // false console.log(isObject(new Function)); // false console.log(isObject(new Number(123))); // false console.log(isObject(null)); // null |
Ramda函数库具有检测javascript类型的出色功能。
解释完整功能:
1 2 3 4 5 | function type(val) { return val === null ? 'Null' : val === undefined ? 'Undefined' : Object.prototype.toString.call(val).slice(8, -1); } |
当我意识到这个解决方案是多么简单和美丽时,我不得不大笑。
Ramda文档中的示例用法:
1 2 3 4 5 6 7 8 9 | R.type({}); //=>"Object" R.type(1); //=>"Number" R.type(false); //=>"Boolean" R.type('s'); //=>"String" R.type(null); //=>"Null" R.type([]); //=>"Array" R.type(/[A-z]/); //=>"RegExp" R.type(() => {}); //=>"Function" R.type(undefined); //=>"Undefined" |
当其他一切都失败时,我使用这个:
1 2 3 | var isObject = function(item) { return item.constructor.name ==="Object"; }; |
1 2 3 4 | if(typeof value === 'object' && value.constructor === Object) { console.log("This is an object"); } |
1 2 3 4 | var isObject = function(obj) { var type = typeof obj; return type === 'function' || type === 'object' && !!obj; }; |
我喜欢用这个
1 2 3 4 5 6 | function isObject (obj) { return typeof(obj) =="object" && !Array.isArray(obj) && obj != null && obj !="" && !(obj instanceof String) } |
我认为在大多数情况下,日期必须作为一个对象通过检查,所以我不过滤日期
如果您想检查
1 2 3 4 | function isObject(n) { if (n == null) return false; return Object.prototype.toString.call(n) === '[object Object]'; } |
我从这个问题中找到了一种"新"的方式来进行这种类型检查:为什么instanceof对于某些文本返回false?
在此基础上,我创建了一个用于类型检查的函数,如下所示:
1 2 3 4 5 6 7 | function isVarTypeOf(_var, _type){ try { return _var.constructor === _type; } catch(ex) { return false; //fallback for null or undefined } } |
然后你可以做:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | console.log(isVarTypeOf('asdf', String)); // returns true console.log(isVarTypeOf(new String('asdf'), String)); // returns true console.log(isVarTypeOf(123, String)); // returns false console.log(isVarTypeOf(123, Number)); // returns true console.log(isVarTypeOf(new Date(), String)); // returns false console.log(isVarTypeOf(new Date(), Number)); // returns false console.log(isVarTypeOf(new Date(), Date)); // returns true console.log(isVarTypeOf([], Object)); // returns false console.log(isVarTypeOf([], Array)); // returns true console.log(isVarTypeOf({}, Object)); // returns true console.log(isVarTypeOf({}, Array)); // returns false console.log(isVarTypeOf(null, Object)); // returns false console.log(isVarTypeOf(undefined, Object)); // returns false console.log(isVarTypeOf(false, Boolean)); // returns true |
这是在Chrome56、Firefox 52、Microsoft Edge 38、Internet Explorer 11、Opera 43上测试的。
编辑:如果还要检查变量是否为空或未定义,则可以使用此选项:
1 2 3 4 5 6 7 8 9 10 11 12 13 | function isVarTypeOf(_var, _type){ try { return _var.constructor === _type; } catch(ex) { return _var == _type; //null and undefined are considered the same // or you can use === if you want to differentiate them } } var a = undefined, b = null; console.log(isVarTypeOf(a, undefined)) // returns true console.log(isVarTypeOf(b, undefined)) // returns true console.log(isVarTypeOf(a, null)) // returns true |
根据国际财务分析中心的意见更新:接受挑战:d
如果要释放比较对象,可以尝试以下方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | function isVarTypeOf(_var, _type, looseCompare){ if (!looseCompare){ try { return _var.constructor === _type; } catch(ex){ return _var == _type; } } else { try{ switch(_var.constructor){ case Number: case Function: case Boolean: case Symbol: case Date: case String: case RegExp: // add all standard objects you want to differentiate here return _var.constructor === _type; case Error: case EvalError: case RangeError: case ReferenceError: case SyntaxError: case TypeError: case URIError: // all errors are considered the same when compared to generic Error return (_type === Error ? Error : _var.constructor) === _type; case Array: case Int8Array: case Uint8Array: case Uint8ClampedArray: case Int16Array: case Uint16Array: case Int32Array: case Uint32Array: case Float32Array: case Float64Array: // all types of array are considered the same when compared to generic Array return (_type === Array ? Array : _var.constructor) === _type; case Object: default: // the remaining are considered as custom class/object, so treat it as object when compared to generic Object return (_type === Object ? Object : _var.constructor) === _type; } } catch(ex){ return _var == _type; //null and undefined are considered the same // or you can use === if you want to differentiate them } } } |
这样,你就可以像国际航空公司的评论那样:
1 2 | isVarTypeOf(new (function Foo(){}), Object); // returns false isVarTypeOf(new (function Foo(){}), Object, true); // returns true |
或
1 2 3 4 5 6 7 | Foo = function(){}; Bar = function(){}; isVarTypeOf(new Foo(), Object); // returns false isVarTypeOf(new Foo(), Object, true); // returns true isVarTypeOf(new Bar(), Foo, true); // returns false isVarTypeOf(new Bar(), Bar, true); // returns true isVarTypeOf(new Bar(), Bar); // returns true |
考虑-
虽然
因此,令大多数开发人员惊讶的是,以下代码将向控制台记录true(而非false):
首先,如果bar是一个函数,上述解决方案将返回false。在大多数情况下,这是所需的行为,但在您还希望为函数返回true的情况下,可以将上述解决方案修改为:
ES5使数组的大小写非常简单,包括它自己的空检查:
如果您已经在使用AngularJS,那么它有一个内置方法来检查它是否是一个对象(不接受空值)。
1 | angular.isObject(...) |
主要使用
基本上,您可以通过检查控制台中的输出来做一个测试代码,过滤掉特定元素是否是对象。在这里,您可以为一个示例运行一个代码:
1 2 3 4 5 6 7 8 9 10 | function cekObject(obj, index) { if (!obj.tagName) { //test case #1 if (typeof obj === 'object') { console.log('obj['+ index +'] is listed as an object'); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js"> function updateFilters() { var object = $('.j-image'); $('.juicer-feed').empty(); for(var index in object) { cekObject(object[index], index); }; } <ul class="juicer-feed" data-feed-id="chetabahana" data-after="updateFilters()"> </ul> <script src="https://assets.juicer.io/embed.js"> |
它取决于用例,如果我们不想让数组和函数成为一个对象,我们可以使用underline.js内置函数。
1 2 3 4 5 | function xyz (obj) { if (_.isObject(obj) && !_.isFunction(obj) && !.isArray(obj)) { // now its sure that obj is an object } } |
您可以使用
1 2 3 4 | var test = {} if(JSON.stringify(test)[0] === '{') { console.log('this is a Object') } |
使用
数组:
如果是对象,则显示"对象"
简单的JS函数,
1 2 3 | function isObj(v) { return typeof(v) =="object" } |
如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | function isObj(v) { return typeof(v) =="object" } var samp_obj = { "a" : 1, "b" : 2, "c" : 3 } var num = 10; var txt ="Hello World!" var_collection = [samp_obj, num, txt] for (var i in var_collection) { if(isObj(var_collection[i])) { console.log("yes it is object") } else { console.log("No it is"+ typeof(var_collection[i])) } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var isArray=function(value){ if(Array.isArray){ return Array.isArray(value); }else{ return Object.prototype.toString.call(value)==='[object Array]'; } } var isObject=function(value){ return value !== null&&!isArray(value) && typeof value === 'object'; } var _val=new Date; console.log(isObject(_val));//true console.log(Object.prototype.toString.call(_val)==='[object Object]');//false |
使用object.prototype的toString()方法可以很容易地做到这一点。
1 2 3 | if(Object.prototype.toString.call(variable) =="[object Object]"){ doSomething(); } |
或
1 2 3 | if(Object.prototype.toString.call(variable).slice(8,-1).toLowerCase() =="object"){ doSomething(); } |
一个小小的nodejs控制台实验,基于马特芬威克的第三个选择阅读他的完整答案上面。只需稍作调整即可获得
对于对象测试,以下返回false。
1 2 3 4 5 6 7 8 9 10 11 12 | > if(Object.getPrototypeOf('v') === Object.prototype){console.log(true);}else{console.log(false);} false undefined > if(Object.getPrototypeOf(1) === Object.prototype){console.log(true);}else{console.log(false);} false undefined > if(Object.getPrototypeOf(false) === Object.prototype){console.log(true);}else{console.log(false);} false undefined > if(Object.getPrototypeOf(['apple']) === Object.prototype){console.log(true);}else{console.log(false);} false undefined |
对象将返回true。
1 2 3 | > if(Object.getPrototypeOf({'this':10}) === Object.prototype){console.log(true);}else{console.log(false);} true undefined |
直接回答当然是
尝试:
1 | isdict(v) { return v !== undefined && v!==null && typeof v==='object' && v.constructor!==Array && v.constructor!==Date; } |
我有一个有效的代码片段。当整段代码都没有给出时,我觉得很困惑,所以我自己创建了它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <!DOCTYPE html> <html> <body> <button onclick="myFunc()">Try it</button> var abc = new Number(); // var abc = 4; //this is a code variation which will give a diff alert function myFunc() { if(abc && typeof abc ==="object") alert('abc is an object and does not return null value'); else alert('abc is not an object'); } </body> </html> |