
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/ecma26 …
----------
この場合、ステップ4の「obj.property が nullなため undefined を返す」という処理が行われた、という解釈で合っているでしょうか?
ほぼ正しいと感じているのですが、「仕様書の中で見るべきところが合っているのか」に自信が持てず、確信に至っていません…。
No.1ベストアンサー
- 回答日時:
よくわかってませんけれど…
>ステップ4の「obj.property が nullなため ~~
objの[[prototype]](obj.propertyではない)がnullなので~~ ではないのでしょうか?
プロパティの有無は、 property in object でも判別可能みたい。
var org = function() { this.a = 'valueA', this.b = 'valueB'; }
org.prototype.c = 'valueC';
var obj2 = new org();
alert(obj2.c); //valueC
alert('c' in obj2); //true
alert('property' in obj2); //false
alert(obj2.hasOwnProperty('c')); //false
この回答への補足
すみません…、自己解決しました。(汗)
「プロパティアクセス演算子」で obj.property の評価についての解説があり、最終的にはやはり [[Get]]メソッド を使用していました。
11.2.1 プロパティアクセス演算子 - 11 式 (Expressions)
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma26 …
8.7.1 GetValue (V) - 8 型 (Types)
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma26 …
8.6.2.1 [[Get]] (P) - 8 型 (Types)
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma26 …
検証頂き、ありがとうございました。
改めて読み直して、頭を抱えました…。
「obj.prototype がnullならば、undefined を返す」と書きたかったはずなのにw
fujillinさんが回答された内容は、私の理解と一致しています。
とりあえず、「問題ない」ってことなのかな?
しばらく待って、新しい回答がつかなければ締め切りたいと思います。
ありがとうございます。
> プロパティの有無は、 property in object でも判別可能みたい。
babu_babooさんが同じような回答をされていましたね。
hasOwnProperty() は存在しないプロパティを評価したら、false を返し、
in演算子は存在しないプロパティを評価したら、false を返す、ということは分かりました。
(in演算子はちょっと分かりづらいですが、最終的には [[HasProperty]]メソッドを呼び出して、true, false を返しています。)
hasOwnProperty - MDC
https://developer.mozilla.org/ja/Core_JavaScript …
11.8.7 in 演算子 (The in operat - 11 式 (Expressions)
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma26 …
8.7.1 GetValue (V) - 8 型 (Types)
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma26 …
8.6.2.4 [[HasProperty]] (P) - 8 型 (Types)
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma26 …
今回、私が疑問に感じたのは「obj.property を評価するときに、なぜ "ReferenceError: obj.property is not defined" にならないのか?」というものです。
未定義のローカル変数では ReferenceError が返るので、直感的に「未定義のプロパティ参照も ReferenceError になるはずだ」と思ってしまったんです。
だから、「プロパティ評価は、typeof演算子ないしhasOwnProperty() メソッドを使用した方が無難」と今までは考えていたのですが、どうも undefined との比較でも通ってしまうようなので「実際のところはどうすべきなのだろう?」と思いまして。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP preg_matchで Warning: Undefined variableが出ます 1 2022/11/15 17:06
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- JavaScript JAVASCRIPT 2 2022/04/15 15:10
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- Ruby Rubyについて質問です 1 2022/05/13 18:20
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
file操作時のエラー
-
C# の例外処理について
-
JAVA テキストの取り出し方に...
-
文字列の種類判定の方法について
-
CreateEventについて
-
VBA Evaluate関数 型が一致しま...
-
WMIスクリプトを使用してMACア...
-
ASP(+COM)で使用できる、暗...
-
読み込んだ文字列のチェック
-
例外(throws)について
-
obj.property のundefined判定
-
Vistaでアプレットを終了するとき
-
ファイルダイアログを開いた時...
-
古い体質をそのまま引き継いで...
-
文字列のDateFormatへのパース
-
google app engine のpythonで...
-
コンパイルエラーについて。
-
時間を表す文字列を時刻に変換
-
PHPのpack関数をJavaで実装でき...
-
VS2010 で summary を生成する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
VB.Net Object型 空かどうか
-
数字か文字列かを判定する関数
-
VBA Evaluate関数 型が一致しま...
-
【JAVA】与えられた金額を貨幣...
-
VC++におけるCStringの変換
-
連続する「\\」をひとつの「\\...
-
文字列からダブルクオートの削除
-
C#の捕捉されない例外処理の対...
-
ファイルダイアログを開いた時...
-
C# マルチスレッドにおける例外...
-
0除算の例外処理ができない!!...
-
時間の取得
-
Timestamp型への変換について(J...
-
例外ってIf文の中に入れますか...
-
Excelでのエラー
-
文字列が数字のみで構成されて...
-
VB.NETで16進数が正しいかどう...
-
String型の日付(2005/11/25)の...
-
VBA 400エラー 1004エラー
おすすめ情報