如何检查值是否是JavaScript中的Object?
检查值是否是JavaScript中的对象
What I like to use is this
function isObject (obj) {
return typeof(obj) == "object"
&& !Array.isArray(obj)
&& obj != null
&& obj != ""
&& !(obj instanceof String) }
I think in most of the cases a Date must pass the check as an Object, so I do not filter dates out
当其他所有方法都失败时,我将使用以下方法:
var isObject = function(item) {
return item.constructor.name === "Object";
};
这将起作用。它是一个返回true,false或可能为null的函数。
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
lodash具有isPlainObject,这可能是许多访问此页面的人正在寻找的东西。给定函数或数组时返回false。
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
我被要求提供更多细节。检查我们的变量是否为对象的最简洁,可理解的方法是typeof myVar
。它返回一个字符串类型(例如"object"
,"undefined"
)。
不幸的是Array和null也都有一个type object
。要仅获取真实对象,需要使用instanceof
运算符检查继承链。它将消除null,但是Array在继承链中具有Object。
所以解决方案是:
if (myVar instanceof Object && !(myVar instanceof Array)) {
// code for objects
}
哦,我的上帝!我认为这可能比以往更短,让我们看一下:
简短代码和最终代码
function isObject(obj)
{
return obj != null && obj.constructor.name === "Object"
}
console.log(isObject({})) // returns true
console.log(isObject([])) // returns false
console.log(isObject(null)) // returns false
解释
返回类型
类型的JavaScript对象(包括null
)返回"object"
console.log(typeof null, typeof [], typeof {})
检查他们的构造函数
检查其constructor
属性将返回具有其名称的函数。
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
引入Function.name
Function.name
返回函数或"anonymous"
闭包的只读名称。
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
注意:从2018年开始,Function.name在IE https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/name#Browser_compatibility中可能不起作用
我很喜欢:
function isObject (item) {
return (typeof item === "object" && !Array.isArray(item) && item !== null);
}
如果该项目是JS对象,并且不是JS数组,并且不是null
…如果所有三个证明都是正确的,则返回true
。如果这三个条件中的任何一个失败,则&&
测试将短路并false
返回。在null
如果需要的话(这取决于你如何使用测试可以省略null
)。
DOCS:
http://devdocs.io/javascript/operators/typeof
http://devdocs.io/javascript/global_objects/object
Object.prototype.toString.call(myVar)
将返回:
"[object Object]"
如果myVar是对象"[object Array]"
如果myVar是一个数组- 等等
For more information on this and why it is a good alternative to typeof, check out this article.
更新:
这个答案是不完整的,并且会产生误导性的结果。例如,在JavaScript中null
也被视为类型object
,更不用说其他几种极端情况了。请遵循以下建议,然后转到其他“最受好评(并且正确!)的答案”。
原始答案:
尝试使用typeof(var)
和/或var instanceof something
。
编辑:这个答案给出了一个如何检查变量属性的想法,但是它不是防弹配方(毕竟根本没有配方!)来检查它是否是一个对象,而不是对象。由于人们倾向于在不做任何研究的情况下从这里寻找要复制的东西,因此我强烈建议他们转向另一个最受好评(也是正确的答案)的答案。
If you are already using AngularJS then it has a built in method which will check if its an object (without accepting null).