Opera9.5βでNodeListの扱いが変化

JavaScriptのArrayではないのに「Arrayとほぼ同じだよ、いまは気にするな」と、入門書では扱われている存在。
それが arguments と NodeList。(他にもあるけど)

arguments とは何なのか?

var a = arguments;

typeof aa instanceof Arraytypeof a === "function"
Firefox2[object Object]××
Firefox3β5[object Object]××
Opera9.25[object Event]×
Opera9.5β2[object Event]×
IE6[object Object]××
IE8[object Object]××
Safari3.1[object Arguments]××

NodeListとは何なのか?

var n = document.getElementById("div"); // NodeListを返す。返さないブラウザもあるけど。

typeof nn instanceof xxxtypeof n === "function"
Firefox2[object HTMLCollection]NodeList
HTMLCollection
×
Firefox3β5[object HTMLCollection]HTMLCollection×
Opera9.25[object NodeList]NodeList×
Opera9.5β2[object NodeList]NodeList
IE6[object]instanceofで調べられない×
IE8[object]instanceofで調べられない×
Safari3.1[object NodeList]NodeList

Opera9.5からはNodeListは"function"になった。9.2x系とは違う。
(n instanceof NodeList) でチェックできるかと思えばそうでもない。

反省会

  • こういう基本的な部分の変化は痛い。下手に最適化を施しておくとそこがアダになる。
    • 小手先の技で高速化を狙わずに、for(;;)ループでまわすのが正解なのかもね。
      • 「オブジェクトの型に依存した処理の切り分けを行っていないか?」と
      • 「新バージョンと旧バージョンの挙動の変化を確認したか?」を、コーディング用のチェックリストに加えておこう。
  • 2008-05-14の日記「未解決の問題」にある、"Opera9.5β2でJSONPが動作しない" の原因を調べていて気が付いた。