我是否需要传递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作为第二个参数,但我想知道这是否会让我在路上遇到麻烦?
我找到了一些相关问题,但它们似乎并不特定于可选参数。非常感谢任何见解。
答案 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
*/
}