1:isArraylike(line:533)----js判断一个对象是不是类数组的对象;

   js中类数组的对象,你第一个想到的是什么,我的第一反应是function中的arguments对象,当然还有通过tagName获取到的元素集合;

   类数组的对象首先他得是一个对象(哈哈,废话一个),其次最关键的是有length属性;

补充:了解类数组方法之前,补充下我对数组的认识(可能很肤浅,忘各位看官见谅,如果有错漏的望各位指点一下,谢谢)。

  a.数组必然存在length属性,

  b.数组可通过索引值读取对应的内容

  c.数组的遍历必然可以通过for循环来解决。

而类数组在某种意义上要符合上述的过程。

function isArraylike( obj ) {

    // Support: iOS 8.2 (not reproducible in simulator)
    // `in` check used to prevent JIT error (gh-2145)
    // hasOwn isn't used here due to false negatives
    // regarding Nodelist length in IE
    var length = "length" in obj && obj.length,//判断对象是否存在length属性存在就赋值
        type = jQuery.type( obj );//获取对象下的类型
  //下方的if判断是做一个类型的甄别
    if ( type === "function" || jQuery.isWindow( obj ) ) {//对象类型不能是function 对象类型还不能符合jQuery.isWindow(obj)(稍后讨论)
        return false;
    }
  //如果obj是元素的话 并且存在length属性 那么必然他是一个 类数组的对象
    if ( obj.nodeType === 1 && length ) {
        return true;
    }
  /*  
  *下方的return 只要一个条件成立他就是类数组或者就是数组对象
  * type === "array";这个是通过 jQuery.type的扩展函数来获取的对象类型(稍后解读)
  * length === 0 这个是干啥的啊 让我想到了获取到了空的元素集合
  * typeof length === "number"&&length>0&&(length-1) in obj;判断这样的var json = {0:"as",1:"a",2:"b",3:"c",length:4};其实也是个类数组 他可以用for来获取除length以外的值
  */
return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; }

 2:jQuery.type( obj )判断对象的类型--(line:300)

    type: function( obj ) {
        if ( obj == null ) {
            return obj + "";
        }
        // Support: Android<4.0, iOS<6 (functionish RegExp)
     /*
     *以下判断是个三元运算
     *  条件:对象obj的类型是否为 object 或者 fuction
     *  条件成立时执行: class2type存在该对象的话返回class2type[object]或class2type[function],否则就返回"object"
     *  条件不成立时执行: 返回对象obj本身的类型(例如:number,string,boolean)
     */
return typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call(obj) ] || "object" : typeof obj; },
class2type可以参考jq2.1.4源码的line:529;
class2type = {
[object Array]"array",[object Boolean]"boolean",[object Date]"date",[object Error]"error",[object Function]"function",[object Number]"number",[object Object]"object",[object RegExp]"regexp",[object String]"string"};

3:isWindow(obj)判断对象是否是window对象
isWindow: function( obj ) {
        return obj != null && obj === obj.window;
    },

此处我觉得最有意思的判断就在于他底下的obj === obj.window的判断;一般情概况下对象底下是不存在window属性的(除非手动定义了一个),但有一个例外;那就是window底下有window的属性并且两个指向的地址完全相同;


posted on 2015-12-08 15:24  Tadini  阅读(346)  评论(0编辑  收藏  举报