10

I am doing a lot of front-end development and I see myself doing this a lot:

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

So I was wondering if the was a way to do this, but shorter and cleaner (I don't like to see arg twice in the same line).

I've seen some people doing something like that :

var int = arg || 400;

And since I don't know in which order I needed to place the value, I tried arg || 400 and 400 || arg, but it will always set int to the value at the right, even if arg is undefined.

I know in PHP you can do something like function doSomething(arg = 400) to set a default value and in a jQuery plugin you can use .extend() to have default property, but is there a short way with a single variable? Or do i have to keep using my way?

Thank for any help and if you can give me resources, it would be appreciated.

4

6 回答 6

15

真的没有比这更短的清洁方法了

var int = arg || 400;

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

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

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

if (arg===undefined) arg=400;
于 2013-05-22T16:12:00.997 回答
0

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

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

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

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

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

function test(x, y) {
    var int1 = (arguments.length > 0) ? x : default;
    var int2 = (arguments.length > 1) ? y : default;
}
于 2013-05-22T16:15:42.043 回答
0

我会检查arguments.length

var f = function(arg) {
  var myArg = arguments.length > 0 ? arg : 400;
};
于 2015-02-11T14:49:45.350 回答
0
function func(x,y){
   if(typeof(x)==='undefined') x = 10;
   if(typeof(y)==='undefined') y = 20;

   //code goes here
}
于 2013-05-22T16:13:03.983 回答
0

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

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

!arg && (arg = 400);

但是,这会测试错误,arg这意味着值false0''和都会导致设置为。如果这不是想要的结果,也许值是一个有效值,那么我通常会测试:nullundefinedarg4000argargument.length

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

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

只有特定的实例0不是我想要的值才会使用该构造

 arg || 400

再次遭受虚假测试

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

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

这将确保这arg是一个数字,并且在代码的其余部分中。

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

于 2013-05-22T16:49:39.523 回答
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];
}
于 2017-06-02T13:25:16.227 回答