2010-12-01 73 views

回答

36

这应该为你做它:

if(Object.prototype.toString.call(someObject) === '[object Object]') { 
    // do your iteration 
} 

的ECMAScript 5 8.6.2节如果你有兴趣:

的[[类]]内部属性的值由本规范针对每种内置对象定义。主对象的[[Class]]内部属性的值可以是除“Arguments”,“Array”,“Boolean”,“Date”,“Error”,“Function”,“JSON”之外的任何字符串值。 ,“数学”,“数字”,“对象”,“RegExp”和“字符串”。 [[Class]]内部属性的值用于内部区分不同类型的对象。请注意,除了通过Object.prototype.toString(见15.2.4.2)外,本规范没有提供任何方法让程序访问该值。

+3

这不再保证在ES6中工作,因为对象可以更改其Symbol.toStringTag属性的值,该属性用于生成Object.prototype.toString的返回值。请参阅http://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring上的注释它看起来像检查某些东西现在可迭代的方式是查看它是否为Symbol.iterator属性被定义 – Ethan 2015-03-18 09:48:32

+0

`Object.prototype.toString`可以被覆盖;因此,不安全。 – 2015-05-12 21:11:40

+3

如果它被覆盖;该开发应该被枪杀!任何原型结构都可能会覆盖它的方法,而如果你不能依赖它们,那么它就没用了。 – 2015-08-05 02:01:32

6

你也可以这样做:

if (someObject.constructor == Object) { 
     // do your thing 
    } 

你可以阅读更多关于它here

+2

如果someObject为null,则它没有构造函数,因此会引发TypeError。你真的想要上面的第一个答案。 – chilts 2013-06-13 03:19:40

-3

这个工作对我来说:

function isObject(o) { 
    try { 
     return ((typeof o == "object") && (o !== null) && (o.length === undefined)); 
    } catch (err) { 
     return false; 
    } 
} 
3

我觉得这样的功能应是原生的,就像Array.isArray

Object.isObject = function(obj) { 
    return obj && obj.constructor === this || false; 
}; 

这一个不会进行函数调用或字符串比较,也不会引用全局对象(如Object),所以它应该很快。尽管如此,我认为这不会用于性能密集型任务,但无论如何。

我并不完全相信这个名字......也许像Object.isLiteral会更好。

虽然它可能会导致主机对象出现问题,但我没有准备好测试。

0

奇怪的是,我为取决于如何的toString()被调用一个子类对象看到对的toString()不同的值:

Object.prototype.toString.call(aThing) “[对象的对象]”

aThing.toString() “ZmPopupMenu”

导致假阳性,所以我改成了更喜欢对象的toString():

var str = someObject.toString ? someObject.toString() : Object.prototype.toString.call(someObject); 
return str === '[object Object]'; 
-1

碰碰古老的线程,但它仍然显示在搜索和人甚至引用它作为一个新的类似的重复 - 仍然是这里最顶级的答案是从正确(抱歉的人,没有得罪)。

要检查是否变量是以下应该使用的对象:

if (typeof variable === 'object') { 
    // do something 
} 

阵列也是对象,所以这会为阵列是真实的太。 此外 - null也是一个有效的对象,因此上述将在null也返回true。 个人的时候,确实需要检查,如果预期的变量是我一直用这个乏味重复公式“可行”对象:

if (variable && typeof variable === `object`) { 
    // do something 
} 

最后但并非最不重要:)请请请,请你帮个忙和唐不要使用任何库来处理这么简单的事情。 Javascript是一种快速发展的语言,今天比昨天多得多,速度如此之快,以至于大多数图书馆的速度还不够快。除此之外,正在从事规范工作的人都做得很好,大多数本地API都是干净的,正确的,与其他语言完美兼容。

1

假设你有一些testvar,并且想知道它是否是一个对象,但不是数组或null(它们都是Object类型)。你可以做以下

testVar instanceof Object && !Array.isArray(testVar) && testVar !== null 
-1

小要点,没有真正优雅,但有效的

function _isObj(_obj){ 

    return (typeof _obj === "object" && JSON.stringify(_obj).indexOf("{") == 0); 

} 

小例子

function _isObj(_obj){ 
 

 
    return (typeof _obj === "object" && JSON.stringify(_obj).indexOf("{") == 0); 
 

 
} 
 

 
var p = document.createElement("p"); 
 
p.textContent = "undefined : " + _isObj(undefined); 
 
document.body.appendChild(p); 
 

 
p = document.createElement("p"); 
 
p.textContent = "null : " + _isObj(null); 
 
document.body.appendChild(p); 
 

 
p = document.createElement("p"); 
 
p.textContent = "boolean : " + _isObj(true); 
 
document.body.appendChild(p); 
 

 
p = document.createElement("p"); 
 
p.textContent = "function : " + _isObj(function(){}); 
 
document.body.appendChild(p); 
 

 
p = document.createElement("p"); 
 
p.textContent = "array : " + _isObj([]); 
 
document.body.appendChild(p); 
 

 
p = document.createElement("p"); 
 
p.textContent = "string : " + _isObj("{}"); 
 
document.body.appendChild(p); 
 
document.body.appendChild(p); 
 
document.body.appendChild(p); 
 

 
p = document.createElement("p"); 
 
p.textContent = "number : " + _isObj(1); 
 
document.body.appendChild(p); 
 
document.body.appendChild(p); 
 

 
p = document.createElement("p"); 
 
p.textContent = "object : " + _isObj({}); 
 
document.body.appendChild(p); 
 

 
p = document.createElement("p"); 
 
p.textContent = "another object : " + _isObj(p); 
 
document.body.appendChild(p);

希望这有助于