IT不死旗下博客隆重开通啦,欢迎各位小伙伴们来围观 。

jQuery中的type方法

jQuery Xueqi 849℃ 0评论

我们可能会想,要判断一个值的类型,直接使用 typeof 运算符不就行了吗?干嘛吃饱了撑着非要写一个函数。当然函数是有它存在的必要的,写jQuery库的人又不傻,但有一些情况下,typeof 运算符会出错。我们来看看下面的例子:

 

var arr=[1,2,3],
arr2=new Array(1,2,3);
num=1,
num2=new Number(3),
str="good",
isCool=true;
var fn=function(){};
var fn2=new Function("a","b","return a+b");



console.log(typeof arr);  // object 注意这个
console.log(typeof arr2); //object 注意这个

console.log(typeof num); //number
console.log(typeof num2); //object 注意这个

console.log(typeof str); //string
console.log(typeof isCool); //boolean

console.log(typeof fn); //function
console.log(typeof fn2); //function

再看看这个:
      console.log({}.toString());//[object Object]
      console.log({}.toString.call(arr) ); //[object Array] 
      console.log({}.toString.call(arr2) );//[object Array]
      console.log({}.toString.call(num2) );// [object Number]
   
  我们知道,几乎所有对象都有toString方法,(null,undefined的特殊类型没有),但又各自重写了toString方法,
   比如,[1,2,3].toString()返回1,2,3 由逗号相连接的字符串
   其中,对象的toString方法可以得到它本身的类型,据此我们可以借用这个来判断对象的类型。
   因为他的类型是[object Array]这样的形式,所以我们需要使用一个映射对象calls2type

 我们发现,typeof 数组时会得到object,这没有错,数组也是对象,但是这不是我们
 想要的,我们想得到的是更具体一些的,另外,typeof new Number(3) 也得到了object
 这就说明typeof有时候不靠谱,下面我们就来看看这个typeof函数

前面有这么些代码:
//生成typelist的map
var class2type = {};
//每个对象实例都有toString方法
var core_toString = class2type.toString;
each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
    class2type[ "[object " + name + "]" ] = name.toLowerCase();
});

1、class2type生成后的内容为
var class2type = {
    "[object Boolean]":"boolean",
    "[object Number]":"number",
    "[object String]":"string",
    "[object Function]":"function",
    "[object Array]":"array",
    "[object Date]":"date",
    "[object RegExp]":"regexp",
    "[object Object]":"object",
    "[object Error]":"error"
}
function type( obj ) {
        if ( obj == null ) {
            return String( obj );
        }
        // Support: Safari <= 5.1 (functionish RegExp)  
       //某些低版本浏览器 typeof 正则的时候会返回“function” 
        return typeof obj === "object" || typeof obj === "function" ?
            class2type[ core_toString.call(obj) ] || "object" :
            typeof obj;
    }

type:

1、判断null==null 或者undefined==null都会返回true。

2、typeof(null) 返回的是object;typeof(undefined)可以得到字符串 “undefined”;

3、String(obj) 首先会看obj有没有toString()方法,有的话直接调用。而没有toString方法的只有null 和undefined,则返回相应的null和undefined。

综上看出 type()方法中的if中返回的是字符串形式的 null 或者 undefined。

一般判断null会用到“===”,而判断undefined会用到typeof ;

注:某些低版本浏览器 typeof 正则的时候会返回“function”
//因为typeof arr1="object" 所以需要使用 {}.toString.call(obj); 用到数组映射,得到正确的类型
 如果是object、function类型,就在判断一次,以便确定具体的类型
当参数obj是number或string和其它的时候直接返回 typeof obj;否则等于class2type[ core_toString.call(obj) ]

转载请注明:凌风阁 » jQuery中的type方法

喜欢 (10)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址