检查一个值是否是JavaScript中的一个对象
你如何检查一个值是否是JavaScript中的对象?
尝试使用typeof(var)
和/或var instanceof something
。
编辑:这个答案给出了如何检查变量的属性,但它不是一个防弹食谱(毕竟没有食谱!)来检查它是否是一个对象,远离它。 由于人们倾向于在没有做任何研究的情况下寻找要从这里复制的东西,我强烈建议他们转向另一个,最有利的(并且是正确的)答案。
如果typeof yourVariable === 'object'
,它是一个对象或null。 如果你想排除null,就把它yourVariable !== null && typeof yourVariable === 'object'
你的yourVariable !== null && typeof yourVariable === 'object'
。
让我们在Javascript中定义“对象” 。 根据MDN文档,每个值都是对象或基元:
原始的,原始值
数据不是对象,也没有任何方法。 JavaScript有5种基本数据类型:字符串,数字,布尔值,空值,未定义。
什么是原始的?
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)
如何检查一个值是否是一个对象
instanceof
本身不起作用,因为它错过了两种情况:
// oops: isObject(Object.prototype) -> false
// oops: isObject(Object.create(null)) -> false
function isObject(val) {
return val instanceof Object;
}
typeof x === 'object'
将不起作用,因为误报( null
)和漏报(函数):
// oops: isObject(Object) -> false
function isObject(val) {
return (typeof val === 'object');
}
Object.prototype.toString.call
将不起作用,因为所有基元都有误报:
> Object.prototype.toString.call(3)
"[object Number]"
> Object.prototype.toString.call(new Number(3))
"[object Number]"
所以我使用:
function isObject(val) {
if (val === null) { return false;}
return ( (typeof val === 'function') || (typeof val === 'object') );
}
@达安的答案似乎也起作用:
function isObject(obj) {
return obj === Object(obj);
}
因为根据MDN文档:
Object构造函数为给定的值创建一个对象包装器。 如果该值为null或未定义,它将创建并返回一个空对象,否则它将返回与给定值相对应的类型的对象。 如果该值已经是一个对象,它将返回该值。
似乎工作的第三种方式(不知道它是否为100%)是使用Object.getPrototypeOf
,如果它的参数不是对象,则引发异常:
// 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({})
链接地址: http://www.djcxy.com/p/5427.html