类型判断总结
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 ); },