代码之家  ›  专栏  ›  技术社区  ›  FK82

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

  •  2
  • FK82  · 技术社区  · 14 年前

    显然两者都没有 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] ) ;
                }
    
            }
    
        }
    

    谢谢你的阅读!

    2 回复  |  直到 5 年前
        1
  •  3
  •   Christian C. Salvadó    14 年前

    依靠 instanceof 运算符是 not good enough 在某些情况下。

    一个已知的问题是,它不会在跨帧环境中工作。

    这个 typeof 运营商并没有那么有用,还有一些实现错误,例如在Chrome或Firefox 2.x中,其中 RegExp 对象检测为 "function" 因为他们已经 可赎回的 (例如) /foo/(str); )

    这个 constructor 财产 可强化处理半透镜 ,你应该 从未 多加信任。

    最后, Function.prototype.toString 方法是 依赖于实现 ,这意味着 可以 在函数的字符串表示形式中甚至不包括函数名…

    一些 days ago 我正在建立一个简单但健壮的 类型检测 函数,它使用 类型 并依赖于 [[Class]] 对象的内部属性。

    所有对象都具有此属性,实现在内部使用它来检测 友善的 它是完全的 不变的 ,并且只能通过 Object.prototype.toString 方法:

    用途:

    //...
    if (typeString(obj) == 'array') {
      //..
    }
    

    实施:

    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();
    }
    

    这个 second variant 这个函数更严格,因为它只返回ECMAScript规范中描述的内置对象类型。

    可能的输出值:

    原语:

    • "number"
    • "string"
    • "boolean"
    • "undefined"
    • "null"
    • "object"

    内置对象类型 (通过 [ [阶级] ] )

    • “功能”
    • "array"
    • "date"
    • "regexp"
    • "error"
        2
  •  1
  •   James Westgate    14 年前

    几天前也出现了类似的问题。我打开jquery 1.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 (sys.isArray(myObject)) doStuff();