Javascript-在使用参数之前检查参数

Javascript-在使用参数之前检查参数,javascript,function,parameters,Javascript,Function,Parameters,我创建了一个弹出功能,最近更改了以下格式: createPopUp('My Popup',600,200); 致: 我只想使用存在的值,因此我目前正在执行以下操作: function createPopUp(config){ if (typeof config.title != 'undefined'){ var theTitle = title; } else { var theTitle = 'Untitled'; } } 然而,这看起来非常混乱,因此我一

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

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

我只想使用存在的值,因此我目前正在执行以下操作:

function createPopUp(config){

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

}

然而,这看起来非常混乱,因此我一直在寻找一种更有效的方法来检查传入参数或设置默认值,如果能在正确的方向上进行微调,我将不胜感激。

通常,逻辑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将首先尝试将变量(从左到右)解析为现有值,或者,最终使用所需的属性创建一个新的对象文本。访问该引用(分组逻辑OR的结果),并将属性
.property
分配给foo。。。我希望这至少有点清楚,如果不是:对不起

小心
某些属性可能未在实例级别设置,或者可能已设置,但已指定falsy值。在这种情况下,逻辑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');

var foo=(obj.hasOwnProperty('val')?obj.val:'default')// 可以扩展一组默认属性,如下所示:

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()
用于此目的,但您并没有这样标记您的帖子。

非常感谢,我喜欢您将默认值存储在一个对象中的方式。我确实使用jQuery,但我喜欢先了解它在做什么@杰克:只是出于好奇,但是你有什么理由使用一个额外的
opts
对象吗?不会
defaults[k]=config[k]| | defaults[k]工作正常吗?毕竟,每次调用函数时都会构造
默认值
对象…@EliasVanOotegem是的,你是对的;对于这个例子,我不想“污染”默认值的内容。。。通常我会将其放在要重用的函数之外,这就是原因。请注意,如果调用方传递例如
height:0
title:“
@Jack,可能在这个特定示例中,但复制此答案的下一个人可能会遇到
0
”的情况,或
false
有意义<代码>{额定值:0,外部电源:false,初始内容:}
=如果您给它一个值或不给它一个值,则测试null。它用于消除以下情况:config={title:null,…};我忘了测试if(config.title.length>0)是否为空或否。在这种情况下,最好只写
和&config.title
,以检查真实值(无emty字符串、非null、非未定义、非零、非false等),因为如果
config.title
是一个数字,
config.title.length
将抛出一个错误。我同意你的看法。我把这个代码只用于定向。上述解决方案比我的要好得多:)
var theTitle = 'Untitled';

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

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