読者です 読者をやめる 読者になる 読者になる

以下斜め読んだ内容

pseudo translation of useful posts, book reviews, remarks,etc. twitter: feeddict

Firefox3で追加の「__count__」プロパティはFirefox4で廃止

自分で作ったオブジェクトのプロパティ数を知りたいときに使えるという触れ込みの「__count__」プロパティの短い生涯

削除の背景

  • bug 551529
    • 「削除したい」提案にBrendan Eichは一つ返事で「削除。糞磨きみたいな代物だし、ES5で同じことできるだろ」とか「ついでに__parent__も削除」とリプライ
  • Where's Walden? » More changes coming to SpiderMonkey: the magical __count__ property is being removed
    • 「__count__」の問題点列挙してる
    • 問題点1:非標準。オレオレプロパティ。SpiderMonkey限定
    • 問題点2:オブジェクトをハッシュとして使う際に面倒になる
      • 変更できないkeyがハッシュの中に存在することを許容
      • 値を更新できない。「__count__=5」とか後からできない。初期化時点の値(定義してないなら0)で固定
    • 問題点3:JITコンパイラの恩恵を受けれれない。最適化されないコード(deoptimization code)になる
    • 問題点4:期待してるほど速くない。forループ回す時同様にメモリ割り当て必要。

影響

  • ベストプラクティスから脱落
21.javascript 1.8ならオブジェクトのプロパティ数を取得できる。
function getPropertyCount(obj) return obj.__count__;
JavaScriptベストプラクティス30選-jsEdu

上記テクニックはFx3系限定のテクニックとなった

  • LABjsの実装変更
    • Fx判別用に「__count__」プロパティ参照してた
    • 代わりに「"MozAppearance"」が「window.document.documentElement.style」にあるかチェック方法に変更
//before:__count__使ってFxを判別
is_gecko = (function(o) { o[o] = o+""; return o[o] != o+""; })(new String("__count__"))

//after:"MozAppearance"の有無で判別
is_gecko = ("MozAppearance" in oDOC.documentElement.style)
//「oDOC」は「window.document」がキャッシュされてる
//LABjsではminify最適化のために
//こういう工夫(minify後にバイト数が削られやすいようにする)を
//随所でやってる