如何检查JavaScript对象是否直接是`{}`实例,而不是子类?

时间:2012-04-25 23:05:57

标签: javascript

我在这里花了10或20分钟,在过去的一年里可能已经十几次了,从来没有找到这个问题的防弹答案。

如何检查JavaScript对象是Object的实例,而不是子类?

一个用例是检查arguments[0]是否为“选项”哈希与“模型”(MVC),两者都扩展了原生Object,但应该对其进行处理不同。

我试过这些:

// some helper to get constructor name
function klassName(fn) {
  if (fn.__name__) {
    return fn.__name__;
  }
  if (fn.name) {
    return fn.name;
  }
  return fn.toString().match(/\W*function\s+([\w\$]+)\(/));
};

var Model = function() {};

m = new Model;
o = {};

Object(o) === o; // true
Object(m) === m; // true, thought it might be false

klassName(o.constructor); // Object
klassName(m.constructor); // Model

klassName(m.constructor)在某些情况下不起作用(不记得确切,但可能是regex.constructor,类似的东西)。也许确实如此,不确定。

是否存在一种防弹方式来判断某些内容是否为{}对象?

3 个答案:

答案 0 :(得分:11)

可能像

这样简单
function isObj( test ) {
    return test.constructor === Object;
}

你在寻找什么?

Test in jsFiddle

答案 1 :(得分:1)

你是说这个意思吗? http://jsfiddle.net/elclanrs/ukEEw/

var o = {};
var re = /\d/;
var f = function(){};
var d = new Date();

var isObj = function(e){
    return e.toString() === '[object Object]';
};

console.log( isObj(o) ); // True
console.log( isObj(re) ); // False
console.log( isObj(f) ); // False
console.log( isObj(d) ); // False

答案 2 :(得分:0)

我只想改变一件事

var isObj = function(e){
    if(!e) return false; // change this line
    return e.toString() === '[object Object]';
};