2012-12-12 41 views
2

我有一个函数,期望一个jQuery对象,但为了方便也想接受选择器字符串和元素。所以,我做这样的事情:可以两次初始化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

他们俩都会工作。但是如果你正在寻找最好的选择,你应该使用第一个功能。 Check this out

更新

Here it is the perf由OP和一个额外的测试修正我没想到英寸

+0

+1为jsperf测试,非常好! – Yoni

+0

谢谢。我已经将这三种情况中的每一种与这两种功能中的每一种相加。所以我们可以看到在哪些情况下我们输了,在哪些情况下我们赢了。不好的一面:它需要一些时间来运行测试,因为现在有8 :( – Diego

+0

谢谢这真棒!我认为有一个错误在我的代码tho ..我认为它应该是“if(!(param1 instanceof $ ))“否则它会检查它是否将param1转换为布尔值,然后检查它是否为jQuery。我修复了代码,它们更接近,但检查一个jQuery对象是最快的,没有重新初始化,我还添加了一个三元案例,在某些情况下更好:) http://jsperf.com/jquery-object-initialization/2 – TruMan1

2

当你实例jQuery的另一个jQuery的元素,它会返回后者的浅表副本。在构造函数中,确定选择器不是字符串或DOM元素后,jQuery.makeArray()被称为here。这又调用jQuery.merge()here来制作浅拷贝。

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

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

看看results

+0

不错,非常精确,而且有很大的差异。我添加了一个三元案例,并且执行与if语句一样好的功能。这意味着每次为自己分配一个变量对于缩短代码而言可以忽略不计:http://jsperf.com/jquery-double-init/2 – TruMan1

+0

@ TruMan1我不喜欢使用三元运算符作为noops :)但它可能不会以任何方式伤害你的表现。 –