通常、これには論理 or 演算子が使用されます。
var theTitle = config.title || 'Untitled';
基本的に、右側のオペランドは、すべての式と同様に、明確な値に解決される式です。左から右に処理されるため、config.title
未定義の場合、文字列'Untitled'
は結果の値になります。必要に応じて、論理演算子をチェーン
することもできます。
var someVar = obj.val || anotherObject.val || yetAnother.foo || 'bar';
または、すべてのオペランドがオブジェクトで、どれが存在するかわからない場合:
var foo = (bar || foobar || {property: 'default: none of the objects exist').property;
オブジェクト参照はグループ化されているため、JS は最初に (左から右に) 変数を既存の値に解決しようとするか、最後に目的のプロパティを持つ新しいオブジェクト リテラルを作成しようとします。その参照 (グループ化された論理和の結果) がアクセスされ、プロパティ.property
が foo に割り当てられます...そうでない場合でも、これが少なくともある程度明確であることを願っています: 申し訳ありません。
一部のプロパティは、インスタンス レベルで設定されていないか、設定されていても偽の値が割り当てられている可能性があることに注意してください。その場合、論理 OR では不十分であり、三項または通常のいずれかを使用する必要がありますif...else
。
var foo = (obj.hasOwnProperty('val') ? obj.val : 'default');//<-- uses val property, even if it's undefined, as long as it's set on the instance
//or:
var foo = 'default';
if ('val' in obj)
{//val is set, either on the instance or on its prototype-chain
foo = obj.val
}
//as ternary:
var foo = ('val' in obj ? obj.val : 'default');