jQueryの$("E F")と$("E").find("F")は等価じゃない

ちょっと前にはまったから、メモメモ。

jQueryは重複する要素のマージをそこまでまじめに行わない。まぁ、マージするということは要素サイズ回のループを行うわけで速度のためには仕方ない。そんなわけで、"E F"をパースするときはタグをマージしつつやるが、$("E").find("F")はgetElementsByTagName("E")の集合を親要素にgetElementsByTagName("F")やったやつを単純にpushするので、重複がたくさん発生する危険性がある。順々にアニメーションさせるときなどは気をつけなければならない。ただ、重複一杯の後者の方が$.dateを要素数分呼び出したりしないので、大抵速い。

精度
正:$("E F")>$("E").find("F"):誤
速度
遅:$("E F")<$("E").find("F"):速

一方、$("E>F")と$("E").find(">F")は精度は変わらない。$("E")で重複が発生しなければ、find(">F")は重複するはずがない。だが、今度はチェックよりも、"E"の個数分だけ、findを関数呼び出しするところが速度低下の要因になる。

精度
正:$("E>F")=$("E").find(">F"):正
速度
速:$("E>F")>$("E").find(">F"):遅

ある程度きびきびとした動作を要求する場合、メソッドチェーンの構成も注意した方がいいと思った。