你能为javascript函数参数设置一个默认值,只有在根本没有传递参数时才使用它吗?

时间:2017-12-30 08:14:23

标签: javascript

所以说你已经

var fun = function({foo='bar'}={}){
    console.log(foo)
}

将输出

fun()
// 'bar'
fun({foo: 'woo'})
// 'woo'
fun({foo: undefined})
// 'bar'

但是,如果您只想在参数未被传递时使用默认值,那么即使它作为未定义传递,它也会被用作未定义的

fun({foo: undefined})
// undefined

只是想知道

3 个答案:

答案 0 :(得分:1)

ES6支持默认参数

const fun = function(obj = {foo: 'bar'}) {
    console.log(obj.foo);
};

fun();
fun({foo: 'woo'});
fun({foo: undefined});

或者您可以自己定义错过参数的行为

var fun = function(obj) {
    if(obj === undefined) {
        obj = {foo: 'bar'};
    }

    console.log(obj.foo);
};

fun();
fun({foo: 'woo'});
fun({foo: undefined});

答案 1 :(得分:0)

不是最漂亮的,但用少量代码完成工作:

function foo(a=(()=>(arguments.length>0 ? undefined : 'bar'))()){
    console.log(a)
}

foo('something') // 'something'
foo(undefined)  // undefined
foo(null)  // null
foo() // bar

由于arguments的工作原理,这不适用于外部的箭头功能或内部的非箭头功能。箭头函数不会创建自己的arguments列表,而内部箭头函数会将其作为局部变量继承。

传递undefined时将使用默认函数参数,但其他虚假值(如null)将保留原始值,这就是null在此示例中按预期工作的原因。

我认为这种方法对于列表末尾的1个可选参数是可以接受的。如果它们在列表中,这种方法将很难失败(因为arguments.length将不再是决定性的),并且您将必须检查并在函数体中重新分配所需的值。

答案 2 :(得分:0)

最后一个案例fun({foo: undefined})没有捷径。

function f( { a } = { a: 1 } ) { 
  if ( a === void 0 ) a = 3
  console.log( a ) 
}

f()
f( undefined )
f( { a: 2 } )
f( { a: undefined } )

function f( { a } = { a: 1 } ) { 
  (function( b = 3 ) {
    console.log( b )
  })(a)
}

f()
f( undefined )
f( { a: 2 } )
f( { a: undefined } )