Javascript 可以初始化jQuery对象两次吗?

Javascript 可以初始化jQuery对象两次吗?,javascript,jquery,jquery-selectors,Javascript,Jquery,Jquery Selectors,我有一个函数,它需要一个jQuery对象,但为了方便起见,还希望接受选择器字符串和元素。所以我在做这样的事情: test($('.something')); test('.something'); test($('.something')[0]); function test (param1) { //ensure jquery object if (!(param1 instanceof $)) { param1 = $(param1); } //do someth

我有一个函数,它需要一个jQuery对象,但为了方便起见,还希望接受选择器字符串和元素。所以我在做这样的事情:

test($('.something'));
test('.something');
test($('.something')[0]);

function test (param1) {
  //ensure jquery object
  if (!(param1 instanceof $)) {
    param1 = $(param1);
  }

  //do something with $param1
}
不管怎样初始化jQuery对象会有什么伤害,还是会有影响和性能问题

function test (param1) {
  //ensure jquery object
  param1 = $(param1);

  //do something with $param1
}

他们两个都会工作。但是如果你在寻找最好的选择,你应该选择第一个函数

更新


通过OP的更正和一个我没有想到的额外测试。

当您使用另一个jQuery元素实例化jQuery时,它将返回后者的浅拷贝。在构造函数内部,确定选择器不是字符串或DOM元素后,将调用
jQuery.makeArray()
。这反过来调用
jQuery.merge()
来创建浅层副本

这显然占用了宝贵的周期,特别是因为希望将一个jQuery对象作为参数。因此,首先使用
instanceof
确定类型更有意义

还有多少道理?假设参数不是jQuery对象的概率为20%,那么执行类型检查将产生6x的性能提升(基于Chrome)


请看一下。

谢谢。我刚刚用这两个函数分别添加了三个案例。所以我们可以看到在哪些情况下我们输了,在哪些情况下我们赢了。不好的一面:运行测试需要一些时间,因为现在有8个:(谢谢,这太棒了!我认为我的代码中有一个bug…。我认为应该是“if(!(param1 instanceof$)”否则,它是在检查是否为jQuery之前将param1转换为布尔值。我修复了代码,它们更接近,但检查jQuery对象最快,无需重新初始化。我还添加了一个三元大小写,在某些情况下实际上执行得更好:)太好了!现在我将在我的回答中更新perf的链接;测试应该反映出jQuery对象是预期的,这意味着在两种“模式”之间改变概率。如果你不确定这意味着什么,请看我答案中的jsperf结果。非常精确,而且有很大的区别。我添加了一个三元case,其性能与if语句差不多。这意味着,为了缩短代码,每次为自身分配一个变量可以忽略不计:@TruMan1我不喜欢在noop中使用三元运算符:),但这两种方式都不会对性能造成太大影响。