为 JavaScript 函数设置默认参数值
我希望 JavaScript 函数具有可选参数,我为其设置了默认值,如果未定义值,则使用这些参数(如果传递了值,则忽略这些参数)。在 Ruby 中,您可以这样做:
def read_file(file, delete_after = false)
# code
end
这在 JavaScript 中有效吗?
function read_file(file, delete_after = false) {
// Code
}
从 ES6/ES2015 开始,默认参数已包含在语言规范中。
function read_file(file, delete_after = false) {
// Code
}
即可正常工作。
参考: 默认参数 - MDN
Default function parameters allow formal parameters to be initialized with default values if no value or undefined is passed.
在 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。(
typeof null == "object"
)
function foo(a, b) {
a = typeof a !== 'undefined' ? a : 42;
b = typeof b !== 'undefined' ? b : 'default_b';
...
}
function read_file(file, delete_after) {
delete_after = delete_after || "my default here";
//rest of code
}
如果
delete_after
的值不是
falsey
值,则将其赋值给
delete_after
,否则将赋值字符串
"my default here"
。有关更多详细信息,请查看
Doug Crockford 的语言调查并查看运算符部分
。
如果您想传入
falsey
值,即
false
、
null
、
undefined
、
0
或
""
,则此方法不起作用。如果您需要传入
falsey
值,则需要使用
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" });
我个人认为像这样简单的代码更加简洁易读。
function pick(arg, def) {
return (typeof arg == 'undefined' ? def : arg);
}
function myFunc(x) {
x = pick(x, 'my default');
}