所以说你已经
了var fun = function({foo='bar'}={}){
console.log(foo)
}
将输出
fun()
// 'bar'
fun({foo: 'woo'})
// 'woo'
fun({foo: undefined})
// 'bar'
但是,如果您只想在参数未被传递时使用默认值,那么即使它作为未定义传递,它也会被用作未定义的
fun({foo: undefined})
// undefined
只是想知道
答案 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 } )