jQuery中的类型判断

在JQuery中有一个type方法,在1.11.2中是这样写的

 1 var class2type = {};
 2 var toString = class2type.toString;
 3 jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
 4     class2type[ "[object " + name + "]" ] = name.toLowerCase();
 5 });
 6 type: function( obj ) {
 7     if ( obj == null ) {
 8         return obj + "";
 9     }
10     return typeof obj === "object" || typeof obj === "function" ?
11         class2type[ toString.call(obj) ] || "object" :
12         typeof obj;
13 }

   其核心在于使用Array.prototype.toString.call,因为在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串。每个类在内部都有一个[[Class]]属性,这个属性中就指定了上述字符串中的构造函数名。

  之所以这样做是因为js内置的类型检测机制并非完全的可靠。

  例如,typeof null  输出“object”

       typeof alert 在IE8中输出“object”

     typeof [] 输出“object”

  instanceof如果是跨文档比较的话,就会存在很大的问题。利用constructor属性的话,在低版本IE中又会出现问题(window.constructor在IE7下为undefined)。而且,二者不方便判断基本类型。

  所以说,判断是否是函数,数组就可以这样写

1 isFunction: function( obj ) {
2     return jQuery.type(obj) === "function";
3 },
4
5 isArray: Array.isArray || function( obj ) {
6     return jQuery.type(obj) === "array";
7 },

  奇怪的是判断是否为window

1 isWindow: function( obj ) {
2     return obj != null && obj == obj.window;
3 },

  似乎伪装一下也能骗过去,可能是因为window对象属于BOM,前面的方法对它不管用。

  然后是isPlainObject,2.0.1中这样写。

 1 isPlainObject: function( obj ) {
 2         // Not plain objects:
 3         // - Any object or value whose internal [[Class]] property is not "[object Object]"
 4         // - DOM nodes
 5         // - window
 6         if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
 7             return false;
 8         }
 9
10         // Support: Firefox <20
11         // The try/catch suppresses exceptions thrown when attempting to access
12         // the "constructor" property of certain host objects, ie. |window.location|
13         // https://bugzilla.mozilla.org/show_bug.cgi?id=814622
14         try {
15             if ( obj.constructor &&
16                     !core_hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
17                 return false;
18             }
19         } catch ( e ) {
20             return false;
21         }
22
23         // If the function hasn‘t returned already, we‘re confident that
24         // |obj| is a plain object, created by {} or constructed with new Object
25         return true;
26     }

  这里的PlainObject应该是如{},new Object,这样的对象。

  第一个if可以排除非Object对象,dom节点,window。

  第二个if是可以排除window.location这样的BOM对象。

  其中,

  class2type = {},

  core_hasOwn = class2type.hasOwnProperty

  因为这些BOM对象的构造函数的原型肯定不是Object {},自身是没有isPrototypeOf这个属性的。

  然后是判断空对象,也就是没有可枚举属性的对象。

1 isEmptyObject: function( obj ) {
2     var name;
3     for ( name in obj ) {
4         return false;
5     }
6     return true;
7 }

  还有一个函数是用来判断是否是数字,

//1.11.2
isNumeric: function( obj ) {
    return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
},

  向parseFloat中传个数组,如[2,4],返回2,但是数组参加右边的运算结果肯定是false,不知道为什么要先判断是否是数组。

  这里如果传入一个如‘123‘、‘321‘这样的字符串的话也是可以通过的。

  在1.8.0和2.0.1版本中直接就是!isNaN( parseFloat(obj) ) && isFinite( obj ).

时间: 2024-07-30 15:37:23

jQuery中的类型判断的相关文章

js中浏览器类型判断

在JS中判断浏览器的类型,估计是每个编辑过页面的开发人员都遇到过的问题.在众多的浏览器产品中,IE.Firefox.Opera.Safari........众多品牌却标准不一,因此时常需要根据不同的浏览器,甚至相同浏览器不同版本做不同的操作,因此,知晓浏览器的判断方法,还是很重要的.下面列举一下常用的判断方法:1.判断浏览器是否为IE        document.all ? 'IE' : 'others':在IE下document.all值为1,而其他浏览器下的值为0:        nav

mybatis中 bit类型判断

<if test="recommend != null and recommend == true"> and g.recommend = 1 </if> <if test="recommend != null and recommend == false"> and g.recommend = 0 </if> recommend类型是bit类型,判断时只能用0(代表false)或者1 (true) 原文地址:http

C++中的类型判断,其余java中的 instanceof 做比较

这是RTTI(运行阶段类型识别)的问题,c++有三个支持RTTI的元素: 1. dynamic_cast 操作符     如果可能的话,dynamic_cast操作符将使用一个指向基类的指针来生成一个指向派生类的指针:否则,该操作符返回空指针.这是最常用的 RTTI组件,它不能回答“指针指向的是哪类对象”这样的问题,但他能回答“是否可以安全地将对象的地址赋给特定类型的指针”这样的问题.如: class A{} class B: public A{} class C: public B{} 然后有

jquery中关于对象类型的判断原理

class2type[ core_toString.call(obj) ] jquery中关于对象类型的判断原理 jquery源码中关于类型判断的工具函数为type,调用方法为$.type()或者jQuery.type(),关于type函数的实现为: 1 type: function( obj ) { 2 if ( obj == null ) { 3 return String( obj ); 4 } 5 // Support: Safari <= 5.1 (functionish RegExp

如何利用jquery.1.9版本判断浏览器的版本类型

如何利用jquery.1.9版本判断浏览器的版本类型:在jquery.1.9以前的版本,可以使用$.browser很轻松的判断浏览器的类型和版本,但是在1.9中和以后的版本中,$.browser已经被删除,下面就介绍一下如何实现此功能,希望能够给需要的朋友带来帮助.一.自定义代码: $.browser.mozilla = /firefox/.test(navigator.userAgent.toLowerCase()); $.browser.webkit = /webkit/.test(navi

从jquery源码中看类型判断和数组的一些操作

在深入看jquery源码中,大家会发现源码写的相当巧妙.那我今天也通过几个源码中用到的技巧来抛砖引玉,希望大家能共同研究源码之精华,不要囫囵吞枣. 1.将类数组转化成数组 我想大家首先想到的方法是for in循环,这是很对的,也是行之有效的.但是并非是效果最优的.因为需要循环,然后把循环出来的值push进新数组里,估计怎么也得10行代码吧... 那么jquery中是怎么用的呢? Array原型上的slice方法. 我们在控制台中打上Array.prototype.slice 那么会出来一个完整的

JavaScript和jQuery的类型判断

此博文为原创,转载请注明出处! 对于类型的判断,JavaScript用typeof来进行. 栗子: console.log(typeof null); //object console.log(typeof []); //object console.log(typeof {}); //object console.log(typeof new Date()); //object console.log(typeof new Object); //object console.log(typeo

PHP判断图片是否存在和jquery中load事件对图片的处理

在公司的图片服务器中,同一个产品一般会存在对应的大图和缩略图.因此,我们在开发手机端的web网站时,默认使用的是产品图片的缩略图,查询数据库时获取的是缩略图的路径.但是,不知什么原因,时不时的,测试的同事总会找到我们,说产品图片没显示出来,是个bug,需要修改. 那么,问题来了. (1)PHP后台如何判断远程服务器上的图片是否存在 解决思路:获取图片路径-->对图片是否存在进行判断-->不存在,使用大图 /** * @desc 检查远程图片是否存在 * @param string $url 图

jquery中判断是否按下回车enter键

<script>   function sendsubmit()   {   $("#userLoginForm").submit();   return false;   }   $(document).keypress(function(event){   var keycode = (event.keyCode ? event.keyCode : event.which);   if(keycode == '13'){   $("#userLoginForm