我正在做很多前端开发,我发现自己做了很多这样的事情:
function doSomething(arg){
var int = arg ? arg : 400
//some code after
}
所以我想知道这是否是一种方法,但更短更清洁(我不希望在同一行中看到arg
两次)。
我见过有些人做过类似的事情:
var int = arg || 400;
由于我不知道我需要放置值,我尝试了arg || 400
和400 || arg
,但它总是将int
设置为右边的值,即使arg
未定义。
我知道在PHP中你可以像function doSomething(arg = 400)
那样设置一个默认值,在jQuery插件中你可以使用.extend()
来设置默认属性,但是有一个简单的方法可以使用单个变量?或者我必须继续使用我的方式?
感谢您的帮助,如果您能给我资源,我们将不胜感激。
答案 0 :(得分:15)
实际上没有比
更短的清洁方式var int = arg || 400;
事实上,如果您希望允许arg作为0
,false
或""
传递,那么正确的方法会更长:
var int = arg===undefined ? 400 : arg;
轻微而频繁的改进是不要声明一个新变量,而是使用原始变量:
if (arg===undefined) arg=400;
答案 1 :(得分:0)
function func(x,y){
if(typeof(x)==='undefined') x = 10;
if(typeof(y)==='undefined') y = 20;
//code goes here
}
答案 2 :(得分:0)
您的解决方案的问题是评估为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;
}
答案 3 :(得分:0)
与问题没有直接关系,但为什么要创建一个新变量来镜像参数?
在这种情况下,我会使用:
!arg && (arg = 400);
但是,这会测试arg
的错误,这意味着值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
是一个数字和其余代码。
总之:它取决于您想要如何使用参数,哪些值有效以及您对代码的调用者有多信任。
答案 4 :(得分:0)
我会检查arguments.length
:
var f = function(arg) {
var myArg = arguments.length > 0 ? arg : 400;
};
答案 5 :(得分:0)
在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];
}