[JavaScript] IEにおけるtypeof Elementの挙動

このエントリーをはてなブックマークに追加

ちょっとびっくりしたのでメモ。
IEだけ typeof Element を実行した時の返り値が違う。
IE11で確かめてもおんなじだったので注意する必要がありそう。

普通なら特に問題ないけど、Haxe使ってるとき困る。タイプセーフキャストが失敗してしまう。

Haxeでこういうコードを書いた時、

HaxeソースはJavaScriptに変換され、キャスト時に内部で js.Boot.__instanceof が呼ばれる。
以下がその抜粋。typeofとinstanceofで判定してるので、IEでだけコケる。

タイプチェックはしたかったので、IEだけ unsafe cast で対応。めんどう。

(2014/7/25追記)

既にHaxeコミュニティでも議論されていて、ブラウザの独自仕様に対応してもキリないから直せないね、という話になってた模様。

Blank101
As part of the ES5 spec (http://ecma262-5.com/ELS5_HTML.htm#Section_11.4.3), native functions return “object” when typeof is called on them. Chrome, Firefox, Opera implement the spec incorrectly and return “function” so there are no problems, but at least iOS Safari (possibly desktop Safari) implement the spec correctly and return “object”. This leads to cast throwing errors if you are working with native DOM objects.

//
// 中略
//

Blank101
I’m going to close this as I can’t see a good way around this problem.
[JS] Fixed instanceof for native functions

IEの方が仕様に沿ってた。IEが悪いと思っててサーセン。この挙動は、Elementはコンストラクタじゃなくて__proto__に放り込む用のプロトタイプオブジェクトだと考えたら納得はできる。でもfunctionの方がいいなあ。

このエントリーをはてなブックマークに追加

コメントを残す

メールアドレスが公開されることはありません。* が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">