对此没有直接的答案,但就:last您使用的选择器而言,它是 Selectors API 标准的专有扩展。.querySelectorAll因此,与本机方法一起使用是无效的。
Sizzle 所做的基本上是尝试将您的选择器与.querySelectorAll.
这意味着包括选择器之类的:last将导致您无法使用本机代码获得 DOM 选择的速度提升。
此外,还包含一些优化,因此当您的选择器非常简单时,例如只是一个 ID 或一个元素名称,将使用原生的getElementById和getElementsByTagName,这非常快;通常甚至比querySelectorAll.
而且由于该.last()方法只是抓取集合中的最后一个项目,而不是过滤所有项目,这是 Sizzle 过滤器通常所做的(至少他们曾经这样做过),这也将起到推动作用。
IMO,远离专有的东西。现在这.querySelectorAll几乎无处不在,只使用符合标准的选择器有真正的优势。做任何进一步的过滤后 DOM 选择。
在 的情况下$("#vacations").find("li"),不要担心中期结果。这将使用getElementById后跟getElementsByTagName,并且会非常快。
如果你真的超级在意速度,那就减少 jQuery 的使用,直接使用 DOM。
您目前会在文档中找到类似 选择器的注释,这些注释会:last警告您性能损失:
因为 :last 是一个 jQuery 扩展而不是 CSS 规范的一部分,所以使用的查询:last不能利用原生 DOMquerySelectorAll()方法提供的性能提升。要在使用:lastto 选择元素时获得最佳性能,首先使用纯 CSS 选择器选择元素,然后使用.filter(":last").
但我不同意这.filter(":last")将是一个很好的替代品。更好的是这样的方法.last()将直接针对元素而不是过滤集合。我有一种感觉,他们只是希望人们继续使用他们不符合标准的选择器。IMO,你最好忘记它们。