我创建了一个弹出功能,最近改变了格式:
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';
}
}
然而,这似乎非常混乱,所以我一直在寻找一种更有效的检查传入参数或设置默认值的方法,并且非常赞赏在正确的方向上轻推。
答案 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;
}