jQuery如何允许你在jQuery对象上使用[]?

Jac*_*kin 8 javascript jquery

说我有以下标记:

<div></div>
<div></div>
<div></div>
Run Code Online (Sandbox Code Playgroud)

我使用以下内容来检索它们:

var divs = $('div');
Run Code Online (Sandbox Code Playgroud)

我怎么可能通过使用[]语法检索相应的DOM元素,并且还能够在jQuery对象上调用方法,例如.first()?

var div_one = divs[0];
Run Code Online (Sandbox Code Playgroud)

我问这个问题,因为它看起来我divs是一个jQuery 对象,而不是一个真正的JavaScript Array对象.

这是如何运作的?

cas*_*nca 8

数字索引只是返回对象的属性.它类似于这样做:

var obj = {};
obj[0] = 'foo';
alert(obj[0]);
Run Code Online (Sandbox Code Playgroud)

数组和伪数组对象几乎完全相同 - 唯一的区别是length真实数组的属性由JavaScript引擎自动管理.

  • @Nathan:不,不.它返回一个对象,该对象具有一些原型化的Array方法.它不是一个数组. (3认同)
  • @patrickdw我在jQuery IRC频道与团队交谈,他们为我清理了它.对jQuery()的调用返回一个jQuery对象,该对象已动态地应用了索引器属性.当调用属性时,它们返回对jQuery()的调用.get()返回jQuery对象中包含的DOM元素数组.就像你说的那样,jQuery对象上的所有Array方法都只是原型化到它上面,并在DOM元素的内部数组上运行. (2认同)
  • @Nathan:我听到你在说什么,但我个人不喜欢像*"数组......包含在jQuery对象中"*和*"内部数组"*这样的术语.这意味着jQuery对象具有对实际Array的内部引用.[实际上它做了什么](https://github.com/jquery/jquery/blob/1.5/src/core.js#L197)当调用`get()`它是通过`构造一个新的(实际)数组Array.prototype.slice`.只要属性是数字,您就可以使用常规对象执行此操作,并且它也具有`length`属性.[实施例](http://jsfiddle.net/8rgRM/1/) (2认同)