这是识别javascript对象类型的好方法吗?

这是识别javascript对象类型的好方法吗?,javascript,object,types,Javascript,Object,Types,显然,无论是instanceof还是typeof都不能正确识别每个javascript对象的类型。我已经想出了这个函数,我正在寻找一些反馈: function getType() { var input = arguments[0] ; var types = ["String","Array","Object","Function","HTML"] ; //!! of the top of my head for(var n=0;

显然,无论是
instanceof
还是
typeof
都不能正确识别每个javascript对象的类型。我已经想出了这个函数,我正在寻找一些反馈:

    function getType() {

        var input = arguments[0] ;

        var types = ["String","Array","Object","Function","HTML"] ; //!! of the top of my head

        for(var n=0; n < types.length; n++) {

            if( input.constructor.toString().indexOf( types[n] ) != -1) {
                document.write( types[n] ) ;
            }

        }

    }
函数getType(){ 变量输入=参数[0]; 变量类型=[“字符串”、“数组”、“对象”、“函数”、“HTML”];/!!在我的头顶 对于(var n=0;n
谢谢你的阅读

在某些情况下,依赖于
instanceof
操作符是不正确的

一个已知的问题是,it wonk不能在跨帧环境下工作

typeof
操作符不是很有用,并且存在一些实现错误,例如在Chrome或Firefox 2.x中,
RegExp
对象被检测为
“function”
,因为它们使可调用(例如
/foo/(str);

constructor
属性可以被篡改,您永远不应该对其过于信任

最后,该方法依赖于实现,这意味着实现可能甚至不包括函数的字符串表示中的函数名

我正在构建一个简单但健壮的类型检测函数,它使用
typeof
作为基本值,并依赖于对象的内部属性

所有对象都具有此属性,实现在内部使用它来检测对象的类型,它是完全不可变的,并且只能通过以下方法访问:

用法:

//...
if (typeString(obj) == 'array') {
  //..
}
if (sys.isArray(myObject)) doStuff();
实施:

function typeString(o) {
  if (typeof o != 'object')
    return typeof o;

  if (o === null)
      return "null";
  //object, array, function, date, regexp, string, number, boolean, error
  var internalClass = Object.prototype.toString.call(o)
                                               .match(/\[object\s(\w+)\]/)[1];
  return internalClass.toLowerCase();
}
此函数的定义更加严格,因为它只返回ECMAScript规范中描述的内置对象类型

可能的输出值:

基本体:

  • “数字”
  • “字符串”
  • “布尔值”
  • “未定义”
  • “null”
  • “对象”
内置对象类型(通过
[[Class]]

  • “函数”
  • “数组”
  • “日期”
  • “regexp”
  • “错误”

    • 类似的问题几天前就出现了。我打开jQuery1.4.2,看看它是如何在那里实现的。这是我到目前为止的结果,你可以检查其余的我确定:

      (function() {
      
          // Define the base sys namespace
          this.sys = function() { };
      
          var toString = Object.prototype.toString;
      
          //from jQuery 1.4.2    
          sys.isFunction = function(obj) {
              return toString.call(obj) === "[object Function]";
          }
      
          //from jQuery 1.4.2
          sys.isArray = function(obj) {
              return toString.call(obj) === "[object Array]";
          }
      }
      
      用法:

      //...
      if (typeString(obj) == 'array') {
        //..
      }
      
      if (sys.isArray(myObject)) doStuff();
      

      看起来很像CMS的技术。是的。他们似乎都使用相同的机制。无论如何,谢谢。你已经赢得了74K的声誉,CMS。好东西。谢谢你能详细解释一下为什么使用
      构造函数
      属性不是一个好主意,因为它可能被“篡改”?@Diobeus,谢谢@FK82我的意思是
      构造函数
      属性是可写的,格式错误的对象可能会给您错误的结果,例如(
      var re=/foo/;re.constructor=null;
      ),在自定义类型上实现继承时,您也可能设置错误的
      构造函数
      。@CMS好的,再次感谢。因此,继承会破坏构造函数。毕竟javascript中没有java,是吗?:-)@FK82:重写构造函数函数的整个
      原型
      成员可能会破坏
      构造函数
      属性。。。是的,JavaScript更像是“C语言中的Lisp”:-)