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;
}