跳过 JavaScript 中的可选函数参数

IT技术 javascript function-parameter
2021-02-11 09:00:49

能否请您指出在 JavaScript 中跳过可选参数的好方法。

例如,我想扔掉opt_这里的所有参数:

goog.net.XhrIo.send(url, opt_callback, opt_method, opt_content, {'Cache-Control': 'no-cache'}, opt_timeoutInterval)
3个回答

解决方案:

goog.net.XhrIo.send(url, undefined, undefined, undefined, {'Cache-Control': 'no-cache'})

您应该使用undefined代替要跳过的可选参数,因为这 100% 模拟了 JavaScript 中可选参数的默认值。

小例子:

myfunc(param);

//is equivalent to

myfunc(param, undefined, undefined, undefined);

强烈建议:如果参数很多,就使用JSON,参数列表中间可以有可选参数。看看这是如何在jQuery 中完成的

我发现您永远无法确定要传递什么而不是“跳过”参数。不明确的?空值?0? 空字符串?空对象?大批?如果省略参数的行为没有记录,或者没有默认参数,你就麻烦了如果更新外部库,您将无法睡个好觉。只有上帝和库开发人员才能知道如果您传递任何意外而不是必需的参数会发生什么。一般来说,如果没有记录这种行为,那么错误就在你身上
2021-03-21 09:00:49
npm module oracledb 大量使用arguments.length。主要是决定是否给出回调。不幸的是,undefined不能选择调用这些方法。需要引入一个if选择合适的参数列表长度wtf
2021-03-30 09:00:49
+1。我不知道这到底是做什么的(与undefined?相同),但它确实最适合“跳过可选参数”。
2021-03-31 09:00:49
这在 2017 年在最新的谷歌浏览器版本上仍然有效,所以我在投票。
2021-04-08 09:00:49
嗨,这很好用,除非函数使用arguments.length。看这个例子: argl = function() { return arguments.length; } argl(1) => 1 argl(1, 未定义, 未定义) => 3 argl(1, 未定义, 2) => 3
2021-04-09 09:00:49

简答

最安全的选择是undefined,并且应该几乎无处不在。但是,最终,您不能欺骗被调用的函数,以为您确实省略了参数。

如果您发现自己null仅仅因为它更短而倾向于使用,请考虑声明一个名为 的变量,_作为 的一个很好的简写undefined

(function() { // First line of every script file
    "use strict";
    var _ = undefined; // For shorthand
    // ...
    aFunction(a, _, c);
    // ...
})(); // Last line of every script

细节

首先要知道:

  • typeof undefined 评估为 "undefined"
  • typeof null 评估为 "object"

所以假设一个函数接受一个它期望类型为 的参数"number"如果你提供null一个值,你会给它一个"object". 语义关闭。1

随着开发人员继续编写越来越健壮的 javascript 代码,您调用的函数显式检查参数值的可能性越来越大,undefined而不是经典的if (aParam) {...}. 如果您继续null交替使用undefined仅仅因为它们都碰巧强制使用false.

但请注意,实际上函数可以判断参数是否被实际省略(相对于设置为undefined):

f(undefined); // Second param omitted
function f(a, b) {
    // Both a and b will evaluate to undefined when used in an expression
    console.log(a); // undefined
    console.log(b); // undefined
    // But...
    console.log("0" in arguments); // true
    console.log("1" in arguments); // false
}

脚注

  1. 虽然undefined也不是 type "number",但它的全部工作是成为一个不是真正类型的类型。这就是为什么它是未初始化变量假定的值,以及函数的默认返回值。

只是null作为参数值传递

补充:您还可以跳过最后一个要传递实际值的后续可选参数(在这种情况下,您可以完全跳过opt_timeoutInterval参数)

您可以传递 undefined 而不是 null,它更有可能在更多情况下工作,但我不确定是否有一个在任何情况下都有效的答案如果我正在编写一个带有可选参数的函数,我可能会检查==null以允许 undefined 或 null(除非 null 由于某种原因是合法值),但我可能会检查arguments对象的长度,并且我看过其他代码用===null这样的检查...
2021-03-14 09:00:49
你确定里面没有 ` === undefined` 检查吗?
2021-03-22 09:00:49
@Dan,我不确定实现该goog.net.XhrIo.send方法的开发人员如何检查可选参数。他可以检查param === undefinedtypeof param === "undefined"param === null或事件只if(param)但是,当您传递空值时,这表明您意识到此参数是可选的,并且明确表示您不想传递任何有意义的值。
2021-03-30 09:00:49
非常感谢@nnnnnn,但这确实是一个通用的JavaScript 问题,答案应该在任何情况下都有效。如果没有通用解决方案,请将其发布在您的答案中。
2021-04-03 09:00:49
@Dan,您以该代码为例,将您的问题表述为通用 JavaScript 问题。如果您需要有关goog.net.XhrIo.send()工作原理的具体帮助,请重新表述问题。
2021-04-10 09:00:49