在JavaScript中正确使用可选参数

时间:2013-06-17 11:18:59

标签: javascript function optional-arguments

我们正在使用自定义日期时间选择器,到目前为止必须返回日期和时间。但现在条件已经改变,有时我只需要返回日期,所以我决定添加一个可选参数。现在脚本是这样的:

var date_format = "dd/mm/yyyy HH:MM:ss";

function viewCalendar(parent, destField, dateOnly) {
    if (typeof dateOnly !== "undefined") {
        date_format = "dd/mm/yyyy";
    }
    //more code...

但即使它似乎有效(我只做了几次尝试)我不太喜欢这个,但也许是因为我不习惯JavaScript的方式。如果不是因为一些示例代码,我会做类似的事情:

var date_format = "dd/mm/yyyy HH:MM:ss";
var dateOnly = true;

function viewCalendar(parent, destField, dateOnly) {
    if (typeof dateOnly != true) {
        date_format = "dd/mm/yyyy";
    }

但是我看到在JS中使用optinal参数的几个例子我没有看到类似的东西。在JavaScript中做这种事情的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

我可能会在这里找到三元运营商

date_format = dateOnly ? "dd/mm/yyyy" : date_format ;

它会查找dateOnly的真实性,并覆盖格式或保留格式

另外

if (typeof dateOnly != true) {
    date_format = "dd/mm/yyyy";
}

似乎错了,可能是

if (dateOnly == true) {
    date_format = "dd/mm/yyyy";
}

答案 1 :(得分:1)

您有几个选择,您已经发现typeof。如果数据不会被 falsy 除非被跳过,您可以使用logical OR ||,三元conditional operator a?b:cif logical NOT检查是否设置 您还可以选择与 undefined void 0进行比较,即使参数预期为 falsy ,这两者仍然有效,但传递 undefined 本身作为参数。

function foo(op0, op1, op2, op3, op4, op5, op6) {
    // if with logical NOT
    if (!op0) op0 = 'default0';
    // logical OR
    op1 || (op1 = 'default1');
    op2 = op2 || 'default2';
    // ternary
    op3 = op3 ? op3 : 'default3';
    // compare, below this line with falsy args too (except explicit `undefined`)
    if (op4 === undefined) op4 = 'default4';
    if (op5 === void 0) op5 = 'default5';
    // compare combined with logical OR
    (op6 !== undefined) || (op6 = 'default6');

    // log parameters to see what we have now
    console.log(op0, op1, op2, op3, op4, op5, op6)
}
foo(); // default0 default1 default2 default3 default4 default5 default6

请注意,在较旧的浏览器中,undefined在全局范围内可写,而在所有浏览器中,如果您不在全球范围内,undefined可以是var d或设置为参数,因此其值不是未定义

如果您对此不满意,请选择使用void运算符而不是undefined 如果您了解它可能发生并且不必担心有人遮蔽undefined,请随意使用它。
如果你看到有人这样做,请问他们是否可以为你var 数组或类似的东西,所以他们意识到他们是愚蠢的。

答案 2 :(得分:1)

另一种方法是使用匿名对象作为单个参数:

function viewCalendar(opts) {
    if (opts.dateOnly) {
       date_format = "dd/mm/yyyy";
    }
}

viewCalendar({parent:foo, destField:bar, dateOnly:true})

当你有很多可选参数时特别有用。