2

我有一个需要 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
}
4

2 回答 2

4

他们都将工作。但是,如果您正在寻找最佳选择,您应该使用第一个功能。看看这个

更新

这是由 OP 进行更正的性能以及我没有想到的一项额外测试。

于 2012-12-12T12:58:03.967 回答
2

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

这显然会占用宝贵的周期,尤其是因为您期望一个 jQuery 对象作为您的参数。instanceof因此,首先使用来确定类型更有意义。

还有多少意义?假设该参数有 20% 的可能性不是 jQuery 对象,那么进行类型检查将产生6 倍的性能提升(基于 Chrome)。

看看结果

于 2012-12-12T13:03:43.223 回答