jQuery创建所谓的(在ES标准中)类似数组的对象。特别是,他们有一个长度属性,并且(使用长度属性),他们有相关的项目放置在基于整数的索引下。
很简单:
var arrayLike = {length: 3, 0:'first', 1:'second', 2:'third'};
Array.prototype.join.call(arrayLike, '|'); // "first|second|third"
如果你看一看the standard(15.4.4),特别是Array.prototype
方法,你会看到在每一个下面的注释:
注* *函数是有意通用的;它不要求 它的这个值是一个Array对象。因此可以将其转换为其他类型的对象以用作方法。 *函数是否可以将 成功应用于主机对象取决于实现。
如果你看看这些算法的描述,他们几乎只使用length属性来遍历对象(在我们的情况下,阵列状对象)和访问背后那些基于整数的值键。出于这个原因,它们是通用的,并且处理具有相关属性的常规js对象。本质上,这就是所有的jQuery(如果我没有记错的话,建设是在嘶嘶声,jQuery的css选择器引擎完成)。你可以用多种方法来测试/证明它。例如,一个标准的js阵列执行一些魔术当长度属性被缩短,但jQuery对象不会:
var arr = [1,2,3], $arr = $('div'); // assuming three divs
arr.length=2; arr[2]; // undefined
$arr.length=2; $arr[2]; // still references the div
http://jsfiddle.net/cnkB9/
所以jquery的makeArray
转换jquery的阵列状物体,并且使它成为一个真正的本地js数组,但正如你所说,然后它没有附加所有的jquery方法。
至于为什么在控制台中显示出来,我指的是这个优秀的答案:What makes Firebug/Chrome console treat a custom object as an array?解释了length
财产的存在和splice
功能,允许它在最控制台看起来像一个数组。如前所述,FF4的Web控制台并不是这种情况,它只是告诉你它不是本地的js数组。有趣的是,splice
函数实际上并不需要工作,只是存在,并且是一个函数。例如:
>> console.log({length:2,0:'some',1:'thing',splice:new Function});
["some", "thing"]
它被认为与'NodeList'工作方式类似于数组,但不是。 – BoltClock
什么是数组对象?你怎么知道它记录一个数组而不是一个对象? –