在函数中设置默认变量值
我正在做很多前端开发,我发现自己做了很多这样的事情:
function doSomething(arg){ var int = arg ? arg : 400 //some code after }
所以我想知道这是否是一种方法,但更短更清洁(我不喜欢在同一行看到两次arg
)。
我见过有些人做过这样的事情:
var int = arg || 400;
因为我不知道我需要放置值,所以我尝试了arg || 400
arg || 400
和400 || arg
400 || arg
,但它总是将int
设置为右边的值,即使arg
未定义。
我知道在PHP中你可以做一些像function doSomething(arg = 400)
来设置默认值,在jQuery插件中你可以使用.extend()
来获得默认属性,但是单个变量有一个简短的方法吗? 或者我必须继续使用我的方式?
感谢您的帮助,如果您能给我资源,我们将不胜感激。
真的没有简短的清洁方式
var int = arg || 400;
事实上,正确的方法会更长,如果你想允许arg传递为0
, false
或""
:
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
,这意味着值false
, 0
, ''
, null
和undefined
都会导致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]; }