2007-07-21

SafariのJavaScriptで特徴だと感じた振る舞い

正式版が出るまでに変更されるかもしれませんが、SafariのJavaScriptで特徴的だと感じた振る舞いをいくつか書いてみます。

■1.組み込みオブジェクトの文字列表現が"[function]"となる
Safari以外の主要ブラウザは、ObjectやStringなどの組み込むオブジェクトから文字列表現(toString()関数で取得)を取り出すと次の形式の文字列が返ります。
function オブジェクト名() {
[native code]
}
この形式は関数インスタンスの文字列表現でも同じで、"[native code]"の部分が関数内のコードに置き換わったものになります。その為、この文字列表現をnative codeを含む関数の判別や、関数名の取得に利用したりするのですが、Safariさんはやってくれました。Safariで組み込みオブジェクトから文字列表現を取り出すと次の文字列が返ります。
[function]
オブジェクト名、"[native code]"どちらもありません。Safariでオブジェクト名を調べる場合はinstanceof演算子を使って調べることになりそうです。またネイティブコードを含む関数かどうかの判定は、「組み込みオブジェクト = ネイティブコードを含む関数」という前提条件をつければ"[function]"はネイティブコードを含む関数とすることができます。

■2.未定義値が設定された配列インデックスはfor inやhasOwnProperty()関数で無いものとして扱われる
Safariは未定義値(void(0))が設定された配列をプロパティとして認識しないようでfor inでは取り出されず、hasOwnProperty()関数にインデックス番号を渡してもfalseが返ります。他のブラウザと同じ振る舞いにするには、hasOwnProperty()関数を自作して判別してあげる必要があります。
var array = ["a","b","c"];
array[0] = void 0;
for(var name in array)
alert(name);
alert(array.hasOwnProperty(0));
このコードを実行すると次の結果になります。
//Internet Explorer、Opera、Mozilla(Firefox)
0
1
2
true

//Safari
1
2
false


個人的には上記の2点は他の主要ブラウザと振る舞いを合わせて欲しいので、もし仕様なら変更してほしいなぁ~と思います。

Learning  jQuery: Better Interaction Design and Web Development With Simple Javascript TechniquesLearning jQuery: Better Interaction Design and Web Development With Simple Javascript Techniques
Jonathan Chaffer Karl Swedberg

Jquery Reference Guide Jquery in Action 2ちゃんねるはなぜ潰れないのか? (扶桑社新書 14) デザイニング・インターフェース ―パターンによる実践的インタラクションデザイン 初めてのJavaScript―Ajax&DOM対応

by G-Tools

1 件のコメント:

aquilegia さんのコメント...

上記二点の振る舞いについて最近確認したところ、他の主要ブラウザと同様の振る舞いに修正されていました。
確認したのはWin版Safari 3.1.1(525.17)で、どのバージョンで修正されたかはわかりませんが、合わせてくれたことを素直に感謝したいです。
Appleさん偉い!