我是否需要传递null作为Javascript函数/方法中可选参数的参数?

时间:2016-12-04 20:21:21

标签: javascript node.js mongoose optional-arguments

我是否需要传递null作为可选参数的参数?

例如,我已经包含了Mongoose文档中的代码:

Model.find(conditions, [projection], [options], [callback])

// Example use
// passing options and executing immediately
MyModel.find({ name: /john/i }, null, { skip: 10 }, function (err, docs) {});

我已经成功地使用了这个方法和其他类似方法而没有传递null作为第二个参数,但我想知道这是否会让我在路上遇到麻烦?

我找到了一些相关问题,但它们似乎并不特定于可选参数。非常感谢任何见解。

2 个答案:

答案 0 :(得分:2)

这取决于函数的编写方式。

以此功能为例:

function repeat(value, times) {
  if (arguments.length === 0) {
    value = "Hello!";
    times = 2;
  } else if (arguments.length === 1) {
    if (typeof value === "number") {
      times = value;
      value = "Hello!";
    } else {
      times = 2;
    }
  }
  var output = "";
  for (var i = 0; i < times; i++) {
    output += value + " ";
  }
  return output;
}

console.log(repeat());
console.log(repeat("Yo!"));
console.log(repeat(5));
console.log(repeat("Yo Yo!", 3));

它期望的参数是完全不同的(在这种情况下,一个是字符串,一个是数字),它可以测试以查看即使提供“第二个”参数也是否省略了“第一个”参数。

您提供的文档说明:

Model.find(conditions, [projection], [options], [callback])

最后三个参数中的每一个都显示为独立可选,这表示您可以省略其中任何一个并仍然提供随后的参数。

the MDN documentation for JSON.stringify比较:

JSON.stringify(value[, replacer[, space]])

第三个参数周围有[]表示它是可选的,但在第二个参数周围的内部 []。这意味着只有在提供第二个参数时才能指定第三个参数。

答案 1 :(得分:0)

Quentin的回答是正确的,我只想在ES6中加上你可以通过destructuring parameters来避免这种情况。

我会举个例子:

let str= "Something";
let num = 10;

doSomething({ str, num });

function doSomething({ somethingElse, num, str }) {
    /* the argument gets passed like 
    { 
        somethingElse: somethingElse, 
        num: num, 
        str: str
    }
    and if any value is missing then it is null, so you can check for
    each property's existance easily
    */
}