スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

javascript の split のキャプチャが動かない...らしい

javascriptで
"abc".split(/(b)/)
などと、splitのセパレータ部分にキャプチャ付きの正規表現を書くと、firefoxだとキャプチャされた部分も結果の配列に含まれる。上記の例だと [ 'a', 'c' ] ではなくて [ 'a', 'b', 'c' ] になる。これは、ECMA-262的には正しい挙動らしい(参考: ECMA-262 のsplitの記述)。

でも、これがIEだと [ 'a', 'c' ] になってしまうらしいのだけど、今手元にIEがないので、このエントリの最後にテストコードを貼っておく。

他にもなんだか var r = eval(...) でevalの結果がrに入らないとか、string.replaceの置換文字列中に $_ と書くと入力文字列全体かなんかになってしまうとかいう噂もあるので、これらもついでにテストするようにしてみた。ちなみにMSのJScriptのリファレンスも見てみたのだが、こんな細かい話は書いてない。

(テスト結果はここに)
String.replaceについては、ECMA-262の説明によれば、$$とか$1とかあらかじめ決められた形式以外はそのまま残す、というのが仕様らしいので、$_ とかを勝手に拡張に使ってはイカンのではないかと思う。

evalについては、ECMA-262のevalの節によれば普通に評価できた場合はその値を返すはずだと思われるのだが。

テストコードはこんなの。

<script type="text/javascript">
function Test(resultElem){
  this.testNumber = 1;
  this.resultElem = resultElem;
};
Test.prototype.is = function(got, expected, name) {
    var ok = (got == expected);
    var result = ((ok ? 'ok ' : 'nok ') + this.testNumber +
                  (name ? ' - ' + name : '') + '<br/>');
    if (!ok) {
      result += ('# got: ' + got + '<br>' +
                 '# expected: ' + expected + '<br>');
    }
    this.testNumber++;
    this.resultElem.innerHTML += result;
}

function runTest(elem) {
    var t = new Test(elem);
    t.is("abc".split(/(b)/).join('!'), 'a!b!c', 'split capture');
    t.is("abcd".replace(/(b)c/, "$_$1"), 'a$_bd', '$_ in replace');
    t.is(eval("10+20"), 30, 'return value of eval');
}
</script>
スポンサーサイト

firefox 2 にしたら

タブのタイトルとブックマークメニューの字がでかくなっていた。気に入らないので、userChrome.cssにこんなこと書いた。
.bookmark-item { font-size:10px !important; }
tab .tab-text {font-size:10px !important; }
他のとこまで変わってしまっているかも知らんが、そのときはそのとき、ってことで。

あと、微妙に変だった翻訳パネルが正式に2.0対応されてたのがうれしかったりする。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。