协慌网

登录 贡献 社区

检查值是否是 JavaScript 中的对象

如何检查值是否是 JavaScript 中的对象?

答案

如果typeof yourVariable === 'object' ,则它是一个对象或 null。如果要排除 null,只需将其typeof yourVariable === 'object' && yourVariable !== null

让我们在 Javascript 中定义 “对象” 。根据MDN 文档 ,每个值都是对象或原语:

原始的,原始的价值

不是对象且没有任何方法的数据。 JavaScript 有 5 种原始数据类型: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() - “new” - 用户定义的函数
    • 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 或未定义,则它将创建并返回空对象,否则,它将返回与给定值对应的类型的对象。如果值已经是一个对象,它将返回该值。


似乎有效的第三种方式(不确定它是否为 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({})

尝试使用typeof(var)和 / 或var instanceof something

编辑:这个答案给出了如何检查变量属性的想法,但它不是一个防弹配方(毕竟根本没有配方!)用于检查它是否是一个对象,远离它。由于人们倾向于在没有进行任何研究的情况下从这里寻找要复制的东西,我强烈建议他们转向另一个,最受欢迎(并且正确!)的答案。