类型判断总结

1.能用typeOf检测出的类型

  undefined,string,number,boolean。

  注:undefined也可使用undefined===void(0);来检测。

2.能用Objcet.prototype.toString.call(obj)检测的类型

  function,array,null,object,reg,error。

  注:null也可以使用obj===null判断。

3.window

  window对象用Objcet.prototype.toString.call(obj)在IE9及以上版本中均可以使用,但在IE6,7,8中调用结果是[object Object],我们可以用一个技巧来识别IE6,7,8下的window

window==document;//true
document==window;//false

  jQuery中,是这样做的:

isWindow: function( obj ) {
        /* jshint eqeqeq: false */
        return obj != null && obj == obj.window;
}

4.数字

  jQuery中是这样做的

isNumeric: function( obj ) {
        // parseFloat NaNs numeric-cast false positives (null|true|false|"")
        // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
        // subtraction forces infinities to NaN
        // adding 1 corrects loss of precision from parseFloat (#15100)
        return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
    }

5.NaN

function isNaN(obj){
  return obj!==obj;  
}

6.空对象

  jQuery中是这样做的

isEmptyObject: function( obj ) {
        var name;
        for ( name in obj ) {
            return false;
        }
        return true;
    }

7.纯对象

  jQuery中是这样做的

// 最常使用的判断之一,纯对象判断
// 纯对象是有 new 或 {} 创建的对象
// 意味着纯对象不能从其他对象原型中继承而来,只能从Object原型中继承
isPlainObject: function( obj ) {
     var key;
     // 首先必须是一个object
     // 针对IE,需要检查对象的constructor属性
     // 把DOM节点和window对象都过滤掉
     if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
          return false;
     }
      try {
          // Not own constructor property must be Object
          if ( obj.constructor &&                      // 不包含构造器
               !hasOwn.call(obj, "constructor") &&
               !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
               return false;
          }
     } catch ( e ) {
          // IE8或9在某些主机上会抛出异常
          return false;
     }
      // 支持: IE<9
     // 先处理继承的属性,之后才会处理自身属性
     if ( support.ownLast ) {
          for ( key in obj ) {
               return hasOwn.call( obj, key );
          }
     }
     // 一般浏览器是先遍历自己的属性,因此利用空变量来略过之前的自身属性,直接跳到最后一个属性
     // 如果最后一个属性是自身的,那么证明了所有属性都是自身的
     for ( key in obj ) {}
     return key === undefined || hasOwn.call( obj, key );
},
原文地址:https://www.cnblogs.com/shytong/p/5502136.html