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 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 回答
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 回答
0
var theTitle = 'Untitled';

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