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)
6     return typeof obj === "object" || typeof obj === "function" ?
7             class2type[ core_toString.call(obj) ] || "object" :
8             typeof obj;
9 }       

关于第一个if判断中的代码为如果你传入的参数为undefined或者null(2 - 4),这个函数会返回"undefined"或者"null";接下来看这个函数的return返回值(6 - 8),这块就比较绕了,是一个比较大兴的三目运算,这个三目运算的条件是一个或运算(6),就是判断传入的参数是否为基本数据类型,如果是,则走基本类型的所用的typeof方法(8);如果不是,则走引用类型的判断(7).

引用类型的判断处有class2type,是jquery初始化的定义的一个空对象,jquery源码引入的时候设置为下边的对象:

 1 {
 2         "[object Boolean]": "boolean",
 3         "[object Number]": "number",
 4         "[object String]": "string"
 5         "[object Function]": "function",
 6         "[object Array]": "array",
 7         "[object Date]": "date",
 8         "[object RegExp]": "regexp",
 9         "[object Object]": "object"
10         "[object Error]": "error"
11 }

这个class2type对象的实现过程如下:

1 // Populate the class2type map
2 jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
3     class2type[ "[object " + name + "]" ] = name.toLowerCase();
4 });

现在再回到引用类型的判断中去,发现下边这个

1 class2type[ core_toString.call(obj) ]

其实说白了就是利用了原生的toString方法,这是Object的方法,我们知道js中所有的对象的方法都是通过继承Object得来的,但是所有除Object对象的其他对象的toString的方法跟Obect的toString方法只是同名,其他对象重写了继承来的toString方法(我猜的,因为Object.call(new Array(1,2)的结果跟new Array(1,2)不一样),说到方法重写,我记得在js原型继承中,子类(应该也可以说是实例吧)可以重写父类原型中的方法。

写在最后,我建议大家以后在判断类型的时候用Object.toString.call()来判断,这样可以避免typeof对引用类型全部返回"object"的尴尬情景

时间: 2024-12-28 16:10:35

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

jQuery中json对象的复制(数组及对象)

摘自: http://www.2cto.com/kf/201306/218838.html 1.jQuery自带的$.map方式: $.map(json, function (n) { return n; }); 这种方式原来用于复制数组还可以,今天用它复制数组中的某一条记录,发现字段名称丢失了,后来发现了第二种方法. 2.深复制与浅复制 // 浅层复制(只复制顶层的非 object 元素) var newObject = jQuery.extend({}, oldObject); // 深层复

jQuery中异步操作对象Deferred

以下介绍一下jQuery中Deferred对象的使用: 1. 通过$.Deferred生成一个deferredObj对象; 2. deferredObj.done()指定操作成功时的回调函数; 3. deferredObj.fail()指定操作失败时的回调函数; 4. deferredObj.promise()没有参数时,作用为保持deferred对象的运行状态不变:接受参数时,作用为在参数对象上部署deferred接口; 5. deferredObj.resolve()手动改变deferred

javascript中对变量类型的判断

本文正式地址:http://www.xiabingbao.com/javascript/2015/07/04/javascript-type 在JavaScript中,有5种基本数据类型和1种复杂数据类型,基本数据类型有:Undefined, Null, Boolean, Number和String:复杂数据类型是Object,Object中还细分了很多具体的类型,比如:Array, Function, Date等等.今天我们就来探讨一下,使用什么方法判断一个出一个变量的类型. 在讲解各种方法之

JS 中对变量类型的判断

总结:1. 一般简单的使用 typeof 或 instanceof 检测(这两种检测的不完全准确)          2. 完全准确的使用 原生js中的 Object.prototype.toString.call  或 jquery中的 $.type 检测 在 JS 中,有 5 种基本数据类型和 1 种复杂数据类型,基本数据类型有:Undefined, Null, Boolean, Number和String:复杂数据类型是Object,Object中还细分了很多具体的类型,比如:Array,

Python中的对象类型的初步介绍

一:介绍 1.为什么使用内置对象 对象类型是语言的一个部分 内置对象构成了每个python程序的核心部分 2.核心数据类型 数字 字符串 列表 字典 元组 文件 集合 其他类型 编程单元类型 与实现相关的类型 二:数字 1.**是乘方 2.math数学模块 3.random模块 三:字符串 1.介绍 字符串是单个

jquery中event对象属性与方法小结

JQuery事件中的Event属性是经常性的被忽略的.大多数时间你的确不怎么用它,但有些时候它还是它还是有作用的.如获知触发时用户的环境(是否按了shift etc).每个浏览器对event都有不同的地方,Jquery对Event做了标准化所以可以放心用. * .target  这个反应触发事件的DOM对象,可以在事件冒泡的时候判断是否是事件源头(compare event.target to this) * .pageX:  鼠标的left属性,相对于page * .pageY:  鼠标的to

继承中的对象类型转化以及程序运行步骤

1class Parent{ 2 3          int x=10; 4          public Parent(){ 5               add(2); 6          } 7          void add(int y){ 8               x+=y; 9          }10     }1112     class Child extends Parent{13          int x=9;14          void add(

jquery中object对象循环遍历的方法

一个朋友问对象如何转为数组,当我问他为啥要转得时候,他告诉我,数组可以用js循环遍历,而对象则不可以.其实呢,对象同样可以循环遍历的啊.不用转换也可以循环!说明你对js或者jquery的某些操作不是很熟练!在这里我简单介绍一下! 案例 我们看如下对象: ? 1 2 3 4 5 6 7 8 9 var data={   张三:69,   李四:72,   王五:90,   二麻子:88,   前端博客:100,   haorooms : 98,   王大壮:99 } 假如上面是后台返回的一个key

jQuery中deferred对象的使用(二)

接上一回的内容,漏了一个always()方法,参数也是回调函数,与done和fail不同的是,无论任何情况都执行always方法中的回调. deferred对象的使用(二) deferred对象不光可以用在jquery的ajax方法中,他提供了一系列的接口,使它的通用型大大提高. 比如有这样一个耗时比较久的方法 function a(){ function b(){ alert('start'); } setTimeout(b, 3000); } 如果要在这个方法之后执行某个回调,就不能用$.w