函数中的javascript可选参数

sal*_*ane 61 javascript

我有一个典型的javascript函数与一些参数

my_function = function(content, options) { action }
Run Code Online (Sandbox Code Playgroud)

如果我这样调用函数:

my_function (options)
Run Code Online (Sandbox Code Playgroud)

参数"options"作为"内容"传递

我如何解决这个问题,所以我既可以通过两个论点,也可以只通过一个?谢谢

Fel*_*ing 95

您必须决定要将哪个参数视为单个参数.你不能把它当作两者兼顾,content而且options.

我看到两种可能性:

  1. 要么改变你的论点的顺序,即 function(options, content)
  2. 检查是否options定义:

    function(content, options) {
        if(typeof options === "undefined") {
            options = content;
            content = null;
        }
        //action
    }
    
    Run Code Online (Sandbox Code Playgroud)

    但是你必须正确记录,如果你只将一个参数传递给函数会发生什么,因为通过查看签名不能立即清楚.

  • @Andrew:`typeof`总是返回一个字符串.或者,`if(options === undefined)`也可以.但正如你所说,有可能在旧浏览器中覆盖`undefined`,所以仍然普遍的做法(我认为)不是直接使用`undefined`(除非你明确地定义了某个地方). (5认同)
  • @inetphantom:不确定你在说什么。那没有意义。无论如何,原始字符串都不是对象。 (2认同)

Dar*_*rov 25

my_function = function(hash) { /* use hash.options and hash.content */ };
Run Code Online (Sandbox Code Playgroud)

然后打电话:

my_function ({ options: options });
my_function ({ options: options, content: content });
Run Code Online (Sandbox Code Playgroud)

  • 红宝石背景的肯定的标志. (40认同)
  • @FrontierPsycho或Perl. (3认同)
  • @BlueBird hash 只是指哈希表(又名字典/关联数组),Darin 将其等同于 Javascript 对象。 (2认同)

Sar*_*raz 18

像这样:

my_function (null, options) // for options only
my_function (content) // for content only
my_function (content, options) // for both
Run Code Online (Sandbox Code Playgroud)


ulo*_*lou 12

使用ES6:

function test(a, b = 3) {
   console.log(a, ' ', b);
}

test(1);      // Output: 1 3
test(1, 2);   // Output: 1 2
Run Code Online (Sandbox Code Playgroud)


gbl*_*zex 5

或者,您也可以根据获得的内容类型来区分。选项曾经是对象,内容曾经是字符串,所以您可以这样说:

if ( typeof content === "object" ) {
  options = content;
  content = null;
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您对重命名感到困惑,则可以使用arguments数组,该数组可以更简单:

if ( arguments.length === 1 ) {
  options = arguments[0];
  content = null;
}
Run Code Online (Sandbox Code Playgroud)