检查值是否是JavaScript中的对象

如何检查值是否是JavaScript中的Object?

Tom西门2020/03/09 21:52:36

If you are already using AngularJS then it has a built in method which will check if its an object (without accepting null).

angular.isObject(...)
MandyEva2020/03/09 21:52:36

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

村村神无猴子2020/03/09 21:52:36

当其他所有方法都失败时,我将使用以下方法:

var isObject = function(item) {
   return item.constructor.name === "Object";
}; 
村村凯宝儿2020/03/09 21:52:36

这将起作用。它是一个返回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

逆天古一Mandy2020/03/09 21:52:36

lodash具有isPlainObject,这可能是许多访问此页面的人正在寻找的东西。给定函数或数组时返回false。

Tony宝儿2020/03/09 21:52:36
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
}
GOItachi2020/03/09 21:52:36

哦,我的上帝!我认为这可能比以往更短,让我们看一下:

简短代码和最终代码

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中可能不起作用

SamStafan十三2020/03/09 21:52:36

我很喜欢:

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

http://devdocs.io/javascript/global_objects/array/isarray

http://devdocs.io/javascript/global_objects/null

村村小小十三2020/03/09 21:52:36

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.

GreenSam2020/03/09 21:52:36

更新

这个答案是不完整的,并且会产生误导性的结果例如,在JavaScript中null也被视为类型object,更不用说其他几种极端情况了。请遵循以下建议,然后转到其他“最受好评(并且正确!)的答案”


原始答案

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

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