jQuery1.3 がリリースされてます。
この日記はご指摘を元に再構成したものです。
ざっと見ました。
1.3β1のバグがいくつか修正されています。
- ID,CLASSセレクタのUNICODE判定で16進数と10進数の勘違い
- 修正前: /#((?:[\w\u0128-\uFFFF_-]|\\.)+)/,
- 修正後: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
- uFFFE 〜 uFFFF は UCS-2(UTF-16)のBOMとしても用いられるため、利用できるコードポイントではありません。uFFEE としておくのが無難です。
[-] は [\-] ってエスケープしなくてもうごくようですが、直したほうがよいでしょう。- id:murky-satyr さんからのブクマコメントで
はい。私が間違ってました(勘違いされた方ごめんなさい。修正しました)
該当する記述は以下にありました。
→ http://www.ecma-international.org/publications/standards/Ecma-262.htm
→ 15.10.2.16 NonemptyClassRangesNoDash
A - character can be treated literally or it can denote a range. It is treated literally if it is the first or
last character of ClassRanges, the beginning or end limit of a range specification, or immediately
follows a range specification.
[-hoge] や [hoge-] なら、- は 範囲指定ではなく、文字そのものとして評価すると書かれています。
murky-satyr さん、ご指摘ありがとうございます。
気になる
- クォートの正規表現が NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/ になっています。
- これだと "don't care" が "don' で切れそうにみえます → 問題ありませんでした。
- CSSセレクタの精度が jQuery1.2.6 の頃から向上していません。
作者のブログを読むと、
「W3Cの仕様には納得がいかない,繁用機能の速度こそが重要で仕様準拠(精度)は犠牲にした」
「サポートしない(したくない)セレクタもあるし、標準には無いが、どうしても欲しい機能を独自セレクタとして実装した」
と言うことらしいのですが、
「CSSセレクタの速度や精度」といった場合、作者に仕様を守る気があるのか無いのかで、言葉の意味が大きく変わってしまうので、「jQuery の速度ってのは BuzzWord なんだ」といまさら気づき(目標が突然消えてしまって)、ちょっとがっかりしました。
- 速度: 標準規(つまりW3Cの仕様)を守った形で実装したものに対しての実行速度(厳格な実装 → 遅くなりがち)
- 速度: 互換性のない形で実装されたものに対しての実行速度(独自実装 → 解釈次第で速くできる)
- 精度: 実装されているセレクタ(サポートを表明しているセレクタ)がW3Cの互換性テストをクリアし正しく動くこと。
- 精度: 標準に準拠していること(サポートしていないセレクタが少ないこと)
jQuery は W3C が用意しているCSSセレクタのテストスイートを試していないようです。
独自解釈 と 標準準拠 では速度を比較する意味が無いので、今後は jQuery の CSSセレクタに関する発言は控えます。
もっと気になる
if (ary instanceOf Array) が軒並み if ( Object.prototype.toString.call(array) === "[object Array]" ) に変えてあります。
jQueryのsvnを検索したところ、以下の記述を見つけました。
http://dev.jquery.com/changeset/5947 で この件の修正が行われていました。
// 修正前 618 // Memory leaks appear in IE6 when applying instanceof 619 // to the window, document or any other COM object (#3485) 620 // http://ajaxian.com/archives/working-aroung-the-instanceof-memory-leak 621 isFunction: function( fn ) { 622 return !!fn && !!fn.hasOwnProperty && fn instanceof Function; 623 }, 624 625 isArray: function( arr ){ 626 return !!arr && arr.constructor == Array; 627 }, // 修正後 618 isFunction: function( obj ) { 619 return toString.call(obj) === "[object Function]"; 620 }, 621 622 isArray: function( obj ) { 623 return toString.call(obj) === "[object Array]"; 624 },
window と document に対し、instanceof を行うとメモリリークすると言うことらしいのですが、ここで、IE6と他のブラウザで共通のコードを走らせるのは、あまり合理的ではない気がします。
メモリリークを回避するだけのために IE6 はコードを分けたほうが良いようにも思えますが、jQuery1.3 のガイドラインではそういうのは「なし」らしいので、このような実装になったのかもしれません。
# os0xさんご指摘の、hostオブジェクトの違いによる Array の判定ミスは本件の動機付けとはあまり関係ないようです。