在函数中设置默认变量值

我正在做很多前端开发,我发现自己做了很多这样的事情:

function doSomething(arg){ var int = arg ? arg : 400 //some code after } 

所以我想知道这是否是一种方法,但更短更清洁(我不喜欢在同一行看到两次arg )。

我见过有些人做过这样的事情:

 var int = arg || 400; 

因为我不知道我需要放置值,所以我尝试了arg || 400 arg || 400400 || arg 400 || arg ,但它总是将int设置为右边的值,即使arg未定义。

我知道在PHP中你可以做一些像function doSomething(arg = 400)来设置默认值,在jQuery插件中你可以使用.extend()来获得默认属性,但是单个变量有一个简短的方法吗? 或者我必须继续使用我的方式?

感谢您的帮助,如果您能给我资源,我们将不胜感激。

真的没有简短的清洁方式

 var int = arg || 400; 

事实上,正确的方法会更长,如果你想允许arg传递为0false""

 var int = arg===undefined ? 400 : arg; 

一个轻微而频繁的改进是不要声明一个新变量但使用原始变量:

 if (arg===undefined) arg=400; 
 function func(x,y){ if(typeof(x)==='undefined') x = 10; if(typeof(y)==='undefined') y = 20; //code goes here } 

解决方案的问题是,计算结果为false的值(例如“false”或“0”)也会触发默认值。 因此,对于每个可能具有计算结果为false的值的参数,您必须明确检查“未定义”。

 var int = (typeof x === 'undefined') ? default : x 

如果这是不可能的,你可以使用

 var int = x ? x : default OR var int = x || default 

另一种选择是使用arguments数组并检查是否给出了参数。 但只有在可选参数是最后一个参数时才能使用。

 function test(x, y) { var int1 = (arguments.length > 0) ? x : default; var int2 = (arguments.length > 1) ? y : default; } 

与问题没有直接关系,但为什么要创建一个新的变量来镜像一个参数?

在这种情况下,我会使用:

 !arg && (arg = 400); 

但是,这个测试用于false ,这意味着值false0''nullundefined都会导致arg被设置为400 。 如果这不是所需的结果,可能值为0是有效的arg值,那么我通常测试argument.length

 function f (arg) { !arguments.length && (arg = 400); 

这将检查是否传递了任何值,并仅在调用根本没有指定参数的情况下设置arg

只有特定的实例,其中0不是所需的值,我将使用该构造

  arg || 400 

再次遭受虚假测试

如果arg是数字很重要,你可以使用:

  typeof arg !== 'number' && (arg = 400); 

这将确保arg是一个数字和代码的其余部分。

总而言之:它完全取决于您希望如何使用参数,哪些值有效以及您对代码调用者的信任程度。

我会检查arguments.length

 var f = function(arg) { var myArg = arguments.length > 0 ? arg : 400; }; 

在ES6中,您可以像在PHP中一样设置参数的默认值:

 function foo( a = [], b = 'string', c = false ){} 

默认值也可以设置为前一个参数甚至是函数的返回值

 function foo( a = true, b = a, c = bar() ){} 

这也适用于ES6编译器。 最终结果将如下所示

 function foo() { var a = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0]; var b = arguments.length <= 1 || arguments[1] === undefined ? a : arguments[1]; var c = arguments.length <= 2 || arguments[2] === undefined ? bar() : arguments[2]; }