Sal*_*ake 8 javascript arguments function
在某些语言中,您可以为函数的参数设置默认值:
function Foo(arg1 = 50, arg2 = 'default') {
//...
}
Run Code Online (Sandbox Code Playgroud)
你是如何用JavaScript做的?
Jam*_*ong 16
在JavaScript中,任何未设置的值都会被赋予值undefined.这意味着如果要为函数设置默认值,则需要检查第一行以查看是否未定义这些值:
function Foo(arg1, arg2) {
if (typeof(arg1) === "undefined") { arg1 = 50; }
if (typeof(arg2) === "undefined") { arg2 = "default"; }
}
Run Code Online (Sandbox Code Playgroud)
如果您大致知道这些值将是什么,您可以采取一些捷径:
function Foo(arg1, arg2) {
arg1 = arg1 || 50;
arg2 = arg2 || "default";
}
Run Code Online (Sandbox Code Playgroud)
但是,如果这些论点是假的,它们将被替换.这意味着,如果Arg1空字符串null,undefined,false或者0它会被更改为50,所以要小心,如果你选择使用它
我更喜欢== null检查而不是typeof(arg1) === undefined(正如jQuery库在内部做的那样:http://docs.jquery.com/JQuery_Core_Style_Guidelines#JSLint).它不仅更简洁,还处理null和undefined,因此客户端代码可以传入null并获取默认值.
也可以将该函数包装在另一个提供默认值的函数中.prototypejs库有一个提供功能的函数argumentNames()(或者如果你不想使用原型,你可以借用实现 - 它只是一个应用于函数结果的正则表达式toString()).
所以你可以这样做:
var Foo = defaults(Foo, { arg1: 50, arg2: 'default' });
function Foo(arg1, arg2) {
//...
}
Run Code Online (Sandbox Code Playgroud)
而实现defaults()将看起来像这样:
function defaults(fn, def) {
return function() {
var arg_names = fn.argumentNames();
var nArgs = args.length;
for (var nArg = 0; nArg < nArgs; ++nArg) {
if (arguments[nArg] == null && arg_names[nArg] in def)
arguments[nArg] = def[arg_names[nArg]];
}
fn.apply(this, arguments);
}
}
Run Code Online (Sandbox Code Playgroud)
当然,这是未经测试的代码及其编写方式,它需要Prototype库.但是所有这一切,== null函数内部的方法对于Javascript来说更自然,更容易调试(你没有其他功能层可以逐步完成),我觉得它更容易阅读:
function Foo(arg1, arg2) {
if (arg1 == null) arg1 = 50;
if (arg2 == null) arg2 = 'default';
}
Run Code Online (Sandbox Code Playgroud)