突然发现接下来马上就是Sizzle的核心代码了,这次就简单分析下Sizzle前面的剩下的代码。这次的篇幅会很短,因为剩下的代码就两段了,就当为Sizzle分析蓄力吧~
话说,尝试着把博客变成响应式布局了(简单粗略版),不知道有没有人发现~
首先是class2type,class2type中保存了一下[object name]-name的键值对,就是为了在判断类型的时候使用。这里使用了each函数来对字符串split后形成的array进行循环添加到class2type中。看代码:
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase();});
这样,在toString()方法调用后返回的值可以直接使用class2type来返回正确的类型了。
第二段函数是isArraylike,这个是用来判断某个对象是否像数组,就是有length,同时从0到length-1都是有对应的值得,这样就可以认为这个对象像一个数组了。同时,默认nodeList是像数组的,代码如下:
function isArraylike( obj ) { var length = obj.length, type = jQuery.type( obj ); // 若为函数,或者是window,那么直接返回false if ( type === "function" || jQuery.isWindow( obj ) ) { return false; } // 若nodeType == document.ELEMENT_NODE并且有length,就认为是像array if ( obj.nodeType === 1 && length ) { return true; } // 有length,并且length的最后一项存在obj中 return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj;}
这样就可以用来判断是否是像array了。
====================================================================
前面几篇有一点没有注意的地方,就是extend到jQuery和jQuery.prototype上的函数作用是不同的。
extend到jQuery上的函数是通过$.method()方式调用的,比如$.dir()。而extend到jQuery.prototype上的话,就是通过$().method()来调用的,比如:$().find()