jquery 将dom对像转换成数组对象
1、jQuery对象(this指向)其实就是一个键值对数据集合,一张普通的hashTabel。集合中,自定义键名可以是字母,也可以是整数,索引方式{name1: "value1", name2: "value2"}[name2]与{0: "value1", 1: "value2"}[1]不存在任何差异,后者数据结构与数组(Array)没有任何关系,那来的”[document]“?
2、jQuery框架之所以在构造器jQuery.fn.init构造返回jQuery对象过程中筛选DOM对象存储到jQuery对象的属性中,存储DOM元素数据键名采用0、1、2......的形式,并且定义了一个length属性,完全是为了方便(兼容)方法jQuery.each操作DOM元素的需要。看看下面简洁模拟就会明白:
jQuery.each = function(object, callback, args) { //object可以为数组Array:[...]也可以是对象Object:{0: DOM1, 1: DOM2, 2: DOM3 ... length: 3+}
for (var i = 0; i < object.length; i ++) {
callback.call(object[i], i, arg)
}
return object
}
jQuery.each(this, function(i, arg) { //这里this就是jQuery对象,传入jQuery.each中遍历键名0、1、2....循环索引,就能很方便的获取每个DOM元素(DOM对象)进行操作处理。
Method .................
//操作1个(或批量操作)DOM元素,并返回jQuery对象(this)。
}, arg)
3、问题在于一些介绍jQuery对象的教程中,把键名为0、1、2 .....的并自定义了length属性的数据结构从jQuery对象中割裂开来称为“类数组”,臆造概念,画蛇添足,误人子弟于云里雾里
<script src="http://code.jquery.com/jquery-1.6.2.js"></script>
<script>
alert(Object.prototype.toString.call($(document)) === '[object Array]'); // ???
alert($(document)[0]===document);
</script>