你如何检查一个值是否是 JavaScript 中的对象?
检查一个值是否是 JavaScript 中的对象
如果typeof yourVariable === 'object'
,它是一个对象或null
。
如果您想null
排除数组或函数,只需执行以下操作:
if (
typeof yourVariable === 'object' &&
!Array.isArray(yourVariable) &&
yourVariable !== null
) {
executeSomeCode();
}
更新:
这个答案是不完整的,并给出了误导性的结果。例如,在 JavaScript 中null
也被认为是类型object
,更不用说其他几个边缘情况了。遵循下面的建议并转到其他“最受好评(和正确!)答案”:
typeof yourVariable === 'object' && yourVariable !== null
原答案:
尝试使用typeof(var)
和/或var instanceof something
.
编辑:这个答案给出了如何检查变量属性的想法,但它不是一个防弹配方(毕竟根本没有配方!)来检查它是否是一个远离它的对象。由于人们倾向于在不做任何研究的情况下从这里寻找可以复制的东西,我强烈建议他们转向另一个最受好评(并且正确!)的答案。
让我们在 Javascript 中定义“对象”。根据MDN 文档,每个值要么是对象,要么是原语:
原始值,原始值
不是对象且没有任何方法的数据。JavaScript 有 7 种原始数据类型:string、number、bigint、boolean、undefined、symbol 和 null。
什么是原始人?
3
'abc'
true
null
undefined
什么是对象(即不是原始对象)?
Object.prototype
- 一切都源于
Object.prototype
Function.prototype
Object
Function
function C(){}
-- 用户自定义函数
C.prototype
-- 用户定义函数的原型属性:这不是C
原型new C()
-- "new"-ing 一个用户定义的函数
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') );
}
@Daan 的回答似乎也有效:
function isObject(obj) {
return obj === Object(obj);
}
因为,根据MDN 文档:
Object 构造函数为给定的值创建一个对象包装器。如果值为 null 或 undefined,它将创建并返回一个空对象,否则,它将返回一个与给定值对应的类型的对象。如果该值已经是一个对象,它将返回该值。
第三种似乎有效的方法(不确定是否为 100%)是使用Object.getPrototypeOf
which如果其参数不是对象则抛出异常:
// 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({})
underscore.js提供了以下方法来确定某物是否真的是一个对象:
_.isObject = function(obj) {
return obj === Object(obj);
};
更新
由于先前 V8 中的错误和微小的微速度优化,自underscore.js 1.7.0(2014 年 8 月)以来,该方法如下所示:
_.isObject = function(obj) {
var type = typeof obj;
return type === 'function' || type === 'object' && !!obj;
};
Object.prototype.toString.call(myVar)
将返回:
"[object Object]"
如果 myVar 是一个对象"[object Array]"
如果 myVar 是一个数组- 等等。
有关这方面的更多信息以及为什么它是 typeof 的一个很好的替代品,请查看这篇文章。