对此没有直接的答案,但就: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()
方法提供的性能提升。要在使用:last
to 选择元素时获得最佳性能,首先使用纯 CSS 选择器选择元素,然后使用.filter(":last")
.
但我不同意这.filter(":last")
将是一个很好的替代品。更好的是这样的方法.last()
将直接针对元素而不是过滤集合。我有一种感觉,他们只是希望人们继续使用他们不符合标准的选择器。IMO,你最好忘记它们。