我希望JavaScript函数具有可选的参数,我在这些参数上设置了默认值,如果未定义值,则使用这些参数(如果传递了值,则忽略这些参数)。在Ruby中,您可以这样做:
def read_file(file, delete_after = false)
# code
end
这在JavaScript中有效吗?
function read_file(file, delete_after = false) {
// Code
}
我希望JavaScript函数具有可选的参数,我在这些参数上设置了默认值,如果未定义值,则使用这些参数(如果传递了值,则忽略这些参数)。在Ruby中,您可以这样做:
def read_file(file, delete_after = false)
# code
end
这在JavaScript中有效吗?
function read_file(file, delete_after = false) {
// Code
}
当前回答
如果出于某种原因,您不在ES6上,并且正在使用lodash,那么这里有一种通过_.defaultTo方法默认函数参数的简洁方法:
var fn=函数(a,b){a=_.defaultTo(a,'Hi')b=_.defaultTo(b,'妈妈!')控制台日志(a,b)}fn()//嗨,妈妈!fn(未定义,空)//嗨,妈妈!fn(NaN,NaN)//嗨,妈妈!fn(1)//1“妈妈!”fn(空,2)//高2fn(假,假)//假-假fn(0,2)//0 2<script src=“https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js“></script>
如果当前值为NaN、null或undefined,将设置默认值
其他回答
默认参数值
使用ES6,您可以完成JavaScript中最常见的习惯用法之一,这与为函数参数设置默认值有关。我们多年来的做法应该很熟悉:
function foo(x,y) {
x = x || 11;
y = y || 31;
console.log( x + y );
}
foo(); // 42
foo( 5, 6 ); // 11
foo( 5 ); // 36
foo( null, 6 ); // 17
这种模式最常用,但当我们传递诸如
foo(0, 42)
foo( 0, 42 ); // 53 <-- Oops, not 42
为什么?因为0是假的,所以x||11的结果是11,而不是直接传入0。为了解决这个问题,有些人会更详细地填写支票,如下所示:
function foo(x,y) {
x = (x !== undefined) ? x : 11;
y = (y !== undefined) ? y : 31;
console.log( x + y );
}
foo( 0, 42 ); // 42
foo( undefined, 6 ); // 17
我们现在可以检查从ES6开始添加的一个非常有用的语法,以简化对缺失参数的默认值分配:
function foo(x = 11, y = 31) {
console.log( x + y );
}
foo(); // 42
foo( 5, 6 ); // 11
foo( 0, 42 ); // 42
foo( 5 ); // 36
foo( 5, undefined ); // 36 <-- `undefined` is missing
foo( 5, null ); // 5 <-- null coerces to `0`
foo( undefined, 6 ); // 17 <-- `undefined` is missing
foo( null, 6 ); // 6 <-- null coerces to `0`
函数声明中的x=11更像x!==未定义?x:11比更常见的成语x||11
默认值表达式
函数默认值可以不仅仅是像31这样的简单值;它们可以是任何有效的表达式,甚至是函数调用:
function bar(val) {
console.log( "bar called!" );
return y + val;
}
function foo(x = y + 3, z = bar( x )) {
console.log( x, z );
}
var y = 5;
foo(); // "bar called"
// 8 13
foo( 10 ); // "bar called"
// 10 15
y = 6;
foo( undefined, 10 ); // 9 10
正如您所看到的,默认值表达式是延迟求值的,这意味着它们只在需要时运行,也就是说,当参数的参数被省略或未定义时。
默认值表达式甚至可以是内联函数表达式调用,通常称为立即调用函数表达式(IIFE):
function foo( x =
(function(v){ return v + 11; })( 31 )
) {
console.log( x );
}
foo(); // 42
对于任何有兴趣在MicrosoftEdge中使用代码的人,不要在函数参数中使用默认值。
function read_file(file, delete_after = false) {
#code
}
在该示例中,Edge将抛出错误“Expected')'”
为了避免这种使用
function read_file(file, delete_after) {
if(delete_after == undefined)
{
delete_after = false;
}
#code
}
截至2016年8月8日,这仍然是一个问题
如果您使用的是ES6+,则可以按以下方式设置默认参数:
功能测试(foo=1,bar=2){console.log(foo,bar);}测试(5);//foo被覆盖,bar保持默认参数
如果需要ES5语法,可以按以下方式执行:
功能测试(foo,bar){foo=foo||2;bar=bar||0;console.log(foo,bar);}测试(5);//foo被覆盖,bar保持默认参数
在上述语法中,使用OR运算符。如果可以将第一个值转换为真,OR运算符总是返回第一个值,如果不能,则返回右手边的值。当在没有相应参数的情况下调用函数时,JS引擎将参数变量(在我们的示例中为bar)设置为undefined。undefined然后转换为false,因此OR运算符返回值0。
未来之声
将来,您将能够将一个对象“散布”到另一个对象(目前截至2019年,Edge不支持!)-演示如何将其用于良好的默认选项,而不考虑顺序:
功能测试(选项){var选项={//默认值url:'defaultURL',some:“somethingDefault”,//使用输入选项覆盖…选项};var body=document.getElementsByTagName('body')[0];body.innerHTML+='<br>'+options.url+':'+options.some;}测试();测试({});测试({url:'myURL'});测试({some:'somethingOfMine');测试({url:'overrideURL',some:'andSomething'});测试({url:'overrideURL',一些:'andSomething',额外:'noProblem'});
MDN参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
…同时,Edge支持的是Object.assign()(IE不支持,但我真的希望我们可以将IE留在后面:)
同样,你也可以这样做
功能测试(选项){var options=对象分配({//默认值url:'defaultURL',some:“somethingDefault”,},选项);//使用输入选项覆盖var body=document.getElementsByTagName('body')[0];body.innerHTML+='<br>'+options.url+':'+options.some;}测试();测试({});测试({url:'myURL'});测试({some:'somethingOfMine');测试({url:'overrideURL',some:'andSomething'});测试({url:'overrideURL',一些:'andSomething',额外:'noProblem'});
编辑:由于对常量选项的评论-在函数的其余部分使用常量选项的问题实际上并不是你不能做到这一点,而是你不能在它自己的声明中使用常量变量-你必须将输入命名调整为
function test(input_options){
const options = {
// defaults
someKey: 'someDefaultValue',
anotherKey: 'anotherDefaultValue',
// merge-in input options
...input_options
};
// from now on use options with no problem
}
根据语法
function [name]([param1[ = defaultValue1 ][, ..., paramN[ = defaultValueN ]]]) {
statements
}
您可以定义正式参数的默认值。还可以使用typeof函数检查未定义的值。