Javascript 链式jQuery对象在什么条件下可以提高性能?

Javascript 链式jQuery对象在什么条件下可以提高性能?,javascript,jquery,Javascript,Jquery,我正在使用一些代码来添加和删除同一对象上的各种CSS类。代码如下所示: function switch_states(object_to_change) { if(object_to_change.hasClass('ready') { object_to_change.removeClass('ready'); object_to_change.addClass('not_ready'); } else { object_to_change.removeClas

我正在使用一些代码来添加和删除同一对象上的各种CSS类。代码如下所示:

function switch_states(object_to_change) {
  if(object_to_change.hasClass('ready') {
    object_to_change.removeClass('ready');
    object_to_change.addClass('not_ready');
  } else {
    object_to_change.removeClass('not_ready');
    object_to_change.addClass('ready');
  }
}
我怀疑我可能可以将这两个snippit链接成
object_to_change.removeClass('ready').addClass('not_ready')
但我想知道:除了易读性和neato因素外,这是否还能提高性能


我的问题是:一个链接对象的工作速度会比两个非链接对象快吗?若然,原因为何?如果没有,那么在什么情况下使用链式对象比使用完全不同的对象更有效——即在什么条件下链式jQuery对象提供性能提升?

这里没有性能提升:它是同一个对象。只有neato因素,这一点不应低估。

在您的示例中,答案是否定的。但是,链接所做的是让您能够而不是在可以使用链(以及当前元素堆栈)执行各种任务的位置声明变量


我建议使用新行链接-这已经成为jQuery的一种惯例。

好吧,你不能真正链接
if()
语句,但是jQuery有一个
toggleClass()
方法,在这里似乎是合适的:

object_to_change.toggleClass('ready not_ready');
这就从一开始就消除了链接与单独调用的需要。我不知道它的性能如何比较。需要进行测试


编辑:我应该注意,上面的解决方案意味着对象已经有一个或另一个。如果没有,另一种方法是将函数传递给
toggleClass

object_to_remove.toggleClass(function( i, cls ) {
    return cls.indexOf( 'ready' ) == -1 ? 'ready' : 'ready not_ready';
});
一个链接对象的工作速度会比两个非链接对象快吗?若然,原因为何

链式对象从选择器开始时速度更快,链式对象可以防止选择器在DOM上多次运行(这是一个相对昂贵的操作)

慢一点:

$(".myClass").val(123);
$(".myClass").addClass("newClass");
更快:

$(".myClass")
    .val(123)
    .addClass("newClass");
在变量中缓存选择器与链接具有相同的好处(即防止昂贵的DOM查找):


最明显的性能提升是在开发和维护中。如果代码是干净的、可读的,并且意图是显而易见的,那么开发人员的时间应该减少

虽然这需要与代码性能相平衡,但如果存在经过测试的、可测量的差异,则需要对速度进行优化。如果可能,在不降低代码可读性的情况下


如果代码的可读性/可维护性会受到影响,请查看优化是否可以作为构建过程的一部分自动进行,以保留可维护的代码以供进一步开发。

@drachenstern-您看过他的示例吗?他有一个缓存的jquery变量。我的回答是正确的。没有选择器在运行。@drachenstern-再次。你不知道你在说什么,嗯?我不同意:他已经选择了jquery对象,并且正在连续使用它两次。+1,我刚刚尝试了这个方法,无论您使用“ready not_ready”还是“not_ready”,它都会起作用。非常方便@Spiny-是的,顺序无关紧要。它将分别分析这两个类,如果它有这个类,它将被删除,否则将被添加。唯一的问题是,如果两者都不存在,它将同时添加这两个,这就是为什么我发布了第二个解决方案,如果两者都不存在,它将默认为“就绪”。
var $selctor = $(".myClass");
$selector.val(123);
$selector.addClass("newClass");