Javascript 这两个jQuery行可以产生不同的结果吗?

Javascript 这两个jQuery行可以产生不同的结果吗?,javascript,jquery,Javascript,Jquery,我正在清理我的一个旧jQuery插件,我发现了以下代码: var foo = $some.find(theCriteria).andSelf().filter(theCriteria); 这看起来很愚蠢,就像是: var foo = $some.andSelf().find(theCriteria); 我想我写第一个版本是有原因的,但我想不出会是什么。后一种代码在功能上是等价的吗?还是我错过了一些微妙的互动 在上述情况下: $some是由一个或多个元素组成的jQuery对象,这些元素通常有

我正在清理我的一个旧jQuery插件,我发现了以下代码:

var foo = $some.find(theCriteria).andSelf().filter(theCriteria);
这看起来很愚蠢,就像是:

var foo = $some.andSelf().find(theCriteria);
我想我写第一个版本是有原因的,但我想不出会是什么。后一种代码在功能上是等价的吗?还是我错过了一些微妙的互动

在上述情况下:

  • $some
    是由一个或多个元素组成的jQuery对象,这些元素通常有子元素
  • theCriteria
    是一个复合CSS选择器字符串,例如,
    “.bar、.jim、.jam”
  • 之所以有
    和self()
    ,是因为
    $some
    可能选择了一个应用了CSS类的根元素,如果是这样,我想选择它

不,它不是等效的

如果您只想支持jQuery 1.8+,那么可以使用.addBack()

您还可以使用。添加

var foo = $some.find(theCriteria).add($some.filter(theCriteria));
由于以下两个原因,情况有所不同:

  • andSelf()在没有前一组元素的情况下添加前一组元素-这会将文档对象添加到元素集中,从而导致不希望的结果
  • 因为您使用的是.find(),所以没有过滤$some对象集

是的,有区别:

<div id="test" class="bar">
  <div class="bar" />
</div>

不,我没有这个插件的测试套件,可以让我发现进行更改是否安全。这是我试图改变的一件事。实际上,
$some.andSelf()
会做任何有用的事情吗?@zerkms不,可能不会。啊……我想这就是线索。在我破坏我刚刚意识到的乐趣之前,我会看看是否有其他人想回答。因此,第二个选项不会包括
$some
中与
标准
选择器匹配的元素。这就是我能想到的区别。第一个做什么-加入两个集合-一些及其所有优势,并通过标准选择器过滤它们。@ArunPJohny问得好。这段代码自2008年以来就已经存在,但我不记得何时将其移植到jQuery。在本例中,我只关心最新版本(2.1.0+),因此,如果现在的行为与以前不同,那也没关系。您可能应该详细说明它不同的原因(当我阅读之前没有使用过的
addBack()
)@Phrogz:second不包括
$some
中的任何内容,我给你一个接受的理由,让你清楚地说明两者的区别。如果未来的读者有类似的情况,请参阅@Arun的答案,以获得更优雅的方式来实现相同的目标(如果你使用他的答案,请向上投票)。@Phrogz谢谢:)我还为旧版本添加了一个变通方法。
<div id="test" class="bar">
  <div class="bar" />
</div>
// gives both <div>
$('#test')
   .find('.bar')
   .andSelf()
   .filter('.bar');

// only returns the inner <div>
$('#test')
   .andSelf()
   .find('.bar')
$('#test')
   .find('.bar')
   .add($('#test').filter('.bar'))