我希望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
}
当前回答
对于任何有兴趣在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日,这仍然是一个问题
其他回答
作为一名长期的C++开发人员(web开发新手:),当我第一次遇到这种情况时,我在函数定义中进行了参数赋值,就像问题中提到的那样,如下所示。
function myfunc(a,b=10)
但要注意,它在不同浏览器之间并不一致。对我来说,它在我的桌面上运行,但在android上不运行。更安全的选择,正如上面提到的那样-
function myfunc(a,b)
{
if (typeof(b)==='undefined') b = 10;
......
}
这个答案的意图不是重复其他人已经提到的相同解决方案,而是告知函数定义中的参数分配可能在某些浏览器上有效,但不要依赖它。
function read_file(file, delete_after) {
delete_after = delete_after || "my default here";
//rest of code
}
如果delete_after的值不是假值,则将其赋值给delete_aafter,否则将赋值字符串“我的默认值”。有关更多详细信息,请查看DougCrockford的语言调查,并查看操作员部分。
如果要传入假值,即false、null、undefined、0或“”,则此方法不起作用。如果需要传入假值,则需要使用Tom Ritter的答案中的方法。
当处理函数的多个参数时,允许使用者在对象中传递参数参数,然后将这些值与包含函数默认值的对象合并通常是有用的
function read_file(values) {
values = merge({
delete_after : "my default here"
}, values || {});
// rest of code
}
// simple implementation based on $.extend() from jQuery
function merge() {
var obj, name, copy,
target = arguments[0] || {},
i = 1,
length = arguments.length;
for (; i < length; i++) {
if ((obj = arguments[i]) != null) {
for (name in obj) {
copy = obj[name];
if (target === copy) {
continue;
}
else if (copy !== undefined) {
target[name] = copy;
}
}
}
}
return target;
};
使用
// will use the default delete_after value
read_file({ file: "my file" });
// will override default delete_after value
read_file({ file: "my file", delete_after: "my value" });
从ES6/ES2015开始,默认参数在语言规范中。
function read_file(file, delete_after = false) {
// Code
}
只是起作用。
参考:默认参数-MDN
如果没有传递值或未定义,则默认函数参数允许使用默认值初始化形式参数。
在ES6中,可以通过析构函数模拟默认命名参数:
// the `= {}` below lets you call the function without any parameters
function myFor({ start = 5, end = 1, step = -1 } = {}) { // (A)
// Use the variables `start`, `end` and `step` here
···
}
// sample call using an object
myFor({ start: 3, end: 0 });
// also OK
myFor();
myFor({});
ES2015之前,
有很多种方法,但这是我的首选方法——它可以让你传递任何你想要的东西,包括false或null。(空类型==“对象”)
function foo(a, b) {
a = typeof a !== 'undefined' ? a : 42;
b = typeof b !== 'undefined' ? b : 'default_b';
...
}
答案是肯定的。事实上,有许多语言支持默认参数。Python就是其中之一:
def(a, enter="Hello"):
print(a+enter)
尽管由于括号的原因,这是Python 3代码,但函数中的默认参数也可以在JS中使用。
例如,在您的案例中:
函数read_file(file,deleteAfter=false){console.log(deleteAfter);}read_file(“test.txt”);
但有时您实际上不需要默认参数。
您可以在函数开始后立即定义变量,如下所示:
函数read_file(文件){var deleteAfter=false;console.log(deleteAfter);}read_file(“test.txt”);
在我的两个示例中,它都返回相同的结果。但有时它们确实会有用,比如在非常先进的项目中。
因此,总之,可以在JS中使用默认参数值。但这与在函数开始后定义变量几乎是一样的。然而,有时它们仍然非常有用。正如您可能注意到的那样,默认参数值比在函数开始后定义参数的标准方法少1行代码。
编辑:这非常重要!这在IE中不起作用。请参阅文档。因此,对于IE,您必须使用“在函数顶部定义变量”方法。默认参数在IE中不起作用。
是的,这将在Javascript中工作。您也可以这样做:
function func(a=10,b=20)
{
alert (a+' and '+b);
}
func(); // Result: 10 and 20
func(12); // Result: 12 and 20
func(22,25); // Result: 22 and 25