使用 $(array).each 遍历数组

Using $(array).each to iterate over array

我最近发现了一个我以前从未见过的 jQuery 结构。这是一个简化版本:

$([ '1', '2', '3' ]).each( function( index, value ) {
  console.log( "index", index, "value", value );
});

这将遍历数组 [ '1', '2', '3' ] 的所有元素。问题是,我习惯于看到 $(...) 与 CSS 选择器一起使用,但我还没有看到它用在新声明的数组上,就像这里所做的那样。不过它似乎可以工作(使用 Firefox 34 和 Chromium 39 测试)。

Q1: 我的理解是否正确,这等同于

var a = [ '1', '2', '3' ];
for ( var i = 0, value; value = a[i]; i++ ) {
  console.log( "index", i, "value", value );
}

如果不是,有什么区别? (除了声明变量 aivalue 之外)。

Q2: 至于在 jQuery 中遍历数组,我更习惯 $.each (不要与 $(selector).each 如上所用)。以上是否等同于

$.each( [ '1', '2', '3' ], function( index, value ){
  console.log( "index", index, "value", value );
});

如果是,为什么jQuery中有两个如此相似的结构?在这两者之间,迭代数组的首选方式是什么,或者这只是个人风格的问题?

Q1.是.

Q2. jQuery 接受数组(和类数组对象)并将它们转换为 jQuery 对象。

您可以通过在浏览器控制台上发出以下命令轻松看到:

console.dir($([ '1', '2', '3' ]))
> VM199:2 e.fn.e.init[3]

那是一个调用 returns 的 jQuery 对象。它们可以用 .each() 迭代。此工具旨在使您能够执行此操作(人为的示例):

$(document.getElementsByTagName("A")).each(func);

使用普通的字符串数组这样做是可行的,并且将来可能会继续工作,但是我仍然认为这是对 API 的误用,并会推荐正确的方法:

$.each(['1', '2', '3' ], func);

Q1:如楼上所说,是的

Q2:首先我会说 不是因为你可以,你应该

你可以使用 $([ '1', '2', '3' ]).each() 是正确的,它会起作用,但效率不高。

两者不一样(虽然它们很相似)。正如 jQuery doc 中所说:

The $.each() function is not the same as $(selector).each(), which is used to iterate, exclusively, over a jQuery object. The $.each() function can be used to iterate over any collection, whether it is an object or an array.

这意味着如果您使用 $([ '1', '2', '3' ]).each(),您将创建一个不需要的 jQuery 对象。在性能方面,jQuery 对象的 属性 each 然后调用传递数组的函数比调用创建数组的 jQuery 对象的函数要快得多,并且然后访问其原型 .each().