obj.property のundefined判定
obj.property のundefined判定
未定義のローカル変数を評価すると、以下の結果になります。
<script type="text/javascript"><!--
var a;
if(a === undefined){ alert('a is undefined!'); } // エラーは発生しない
if(b === undefined){ alert('b is undefined!'); } // 「ReferenceError: b is not defined」のエラーが発生し、if文が評価されない
if('undefined' === typeof b){ alert('b is undefined!'); } // エラーは発生しない
//--></script>
未定義のローカル変数は undefined との比較ではチェックできず、typeof でチェックする必要があることが分かります。
対して、「存在が保証されているオブジェクトの存在しないプロパティ」でチェックすると、以下の結果になります。
<script type="text/javascript"><!--
var obj = { a:'valueA', b:'valueB' };
if(obj.property === undefined){ alert('obj.property is undefined!'); } // エラーは発生しない
if('undefined' === typeof obj.property){ alert('obj.property is undefined!'); } // エラーは発生しない
//--></script>
不思議に思い、ECMA-262 3rd Edition仕様書を読んでみたところ、下記文言が見つかりました。
----------
8.6.2.1 [[Get]] (P)
O の [[Get]] メソッドがプロパティ名 P で呼出されると、次のステップがとられる:
1. O が P という名前のプロパティを持っていなければ、ステップ 4 へ進む。
2. そのプロパティの値を取得する。
3. Result(2) を返す。
4. O の [[Prototype]] が null ならば、undefined を返す。
5. [[Prototype]] の [[Get]] メソッドを、プロパティ名 P で呼び出す。
6. Result(5) を返す。
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/8_Types.html#section-8.6.2
----------
この場合、ステップ4の「obj.property が nullなため undefined を返す」という処理が行われた、という解釈で合っているでしょうか?
ほぼ正しいと感じているのですが、「仕様書の中で見るべきところが合っているのか」に自信が持てず、確信に至っていません…。