2

ポップアップ関数を作成し、最近フォーマットを次のように変更しました。

createPopUp('My Popup',600,200);

このメソッドに:

createPopUp({ title: 'My Popup', width: 600, height: 200 });

値が存在する場合にのみ値を使用したいので、現在これを行っています:

function createPopUp(config){

  if (typeof config.title != 'undefined'){
    var theTitle = title;
  } else {
    var theTitle = 'Untitled';
  }

}

ただし、これは非常に厄介なように思われるため、受信パラメーターをチェックしたり、デフォルト値を設定したりするより効率的な方法を探していました。正しい方向に微調整していただければ幸いです。

4

3 に答える 3

3

次のように、プロパティのデフォルト セットを拡張できます。

var defaults = {
    title: 'Untitled',
    width: 100,
    height: 100
}

function createPopUp(config)
{
    var opts = {}

    for (var k in defaults) {
        opts[k] = config[k] || defaults[k];
        // sometimes falsy values should be allowed to override defaults
        // in that case, use this instead:
        // opts[k] = typeof config[k] != 'undefined' ? config[k] : defaults[k]
    }

    // opts contains values from defaults where config doesn't have them
}

jQuery には$.extend()この目的に便利な機能がありますが、投稿にそのようにタグ付けしていません。

于 2012-12-28T14:06:22.127 に答える
3

通常、これには論理 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');
于 2012-12-28T14:00:53.793 に答える
0
var theTitle = 'Untitled';

if('title' in config && config.title != null && config.title.length > 0){
    theTitle = config.title;
}
于 2012-12-28T14:07:03.783 に答える