Javascript - 在使用之前检查参数

时间:2012-12-28 13:58:42

标签: javascript function parameters

我创建了一个弹出功能,最近改变了格式:

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

this method

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

我只想使用它们存在的值,所以我目前正在这样做:

function createPopUp(config){

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

}

然而,这似乎非常混乱,所以我一直在寻找一种更有效的检查传入参数或设置默认值的方法,并且非常赞赏在正确的方向上轻推。

3 个答案:

答案 0 :(得分: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');

答案 1 :(得分: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()用于此目的,但你没有标记你的帖子。

答案 2 :(得分:0)

var theTitle = 'Untitled';

if('title' in config && config.title != null && config.title.length > 0){
    theTitle = config.title;
}