0

条件演算子の true 節で、未定義のプロパティのこの予期しない動作が発生しています。

例: Javascript:

var obj = undefined;

console.log("hello world" + (obj) ? obj.Name.toString(): "Object not defined");

フィドル

予期される動作は、「定義されていません」というログ エントリを取得することです。hello worldObject代わりにエラーがスローされます: SCRIPT5007: Unable to get value of the property 'Name': object is null or undefined.これはどのように行われるのでしょうか。

var obj = undefined;

console.log("hello world" + ((obj) ? obj.Name.toString(): "Object not defined"));

フィドル

4

3 に答える 3

2

この条件を試してください:

console.log("hello world" + ((obj || {}).Name) ? ...);

またはまた

console.log("hello world" + ((obj || 0).Name) ? ...);

objしたがって、 と の両方をチェックしますobj.Name
実際、定義した条件はチェックするだけで、チェックしobjませんobj.Name

ajaxianでこの種の状態についての説明を読むことができます

于 2013-06-07T14:10:19.493 に答える
1

ここでの問題はグループ化です-あなたの行は次のものと同等です:

("hello world" + obj) ? obj.Name.toString(): "Object not defined"

("hello world" + obj)これはJavaScript でブール値に"hello worldundefined"強制されるため、ブラウザは存在しない関数trueを見つけて実行しようとします。obj.Name.toString()

また、手動で設定しない限り、ほとんどのオブジェクトにはNameプロパティがないと確信しています。未定義の値はNameオブジェクトではなく、オブジェクトに変換できないため、プロパティを持つことはありません。したがって、記載されているエラーが発生します。

代わりにその特定のプロパティを確認したい場合は、次のようにする必要があります。

var obj = undefined;
console.log("hello world" + (typeof obj === 'object' && obj.Name != null ? obj.Name.toString(): " Object not defined"));
于 2013-06-07T14:10:17.273 に答える
0

代わりに次のことを行う必要があります。(obj && obj.Name) ? obj.Name.toString(): "Object not defined"

あなたの状態

(obj) ? obj.Name.toString(): "Object not defined"

が定義されているかどうかのみをチェックし、それを呼び出す前に が定義されてobjいるかどうかをチェックしません。obj.Name.toString()

于 2013-06-07T14:14:38.250 に答える