Opera9.5βでNodeListの扱いが変化
JavaScriptのArrayではないのに「Arrayとほぼ同じだよ、いまは気にするな」と、入門書では扱われている存在。
それが arguments と NodeList。(他にもあるけど)
arguments とは何なのか?
var a = arguments;
typeof a | a instanceof Array | typeof 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 n | n instanceof xxx | typeof 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(;;)ループでまわすのが正解なのかもね。
- 「オブジェクトの型に依存した処理の切り分けを行っていないか?」と
- 「新バージョンと旧バージョンの挙動の変化を確認したか?」を、コーディング用のチェックリストに加えておこう。
- 小手先の技で高速化を狙わずに、for(;;)ループでまわすのが正解なのかもね。
- 2008-05-14の日記「未解決の問題」にある、"Opera9.5β2でJSONPが動作しない" の原因を調べていて気が付いた。