2011-12-02 143 views
32

请您指点一下在JavaScript中跳过可选参数的好方法。跳过JavaScript中的可选功能参数

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

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

回答

69

解决方案:

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是如何完成的。

+1

+1的方式。我不知道它的确做了什么(与undefined相同),但它确实最适合“跳过可选参数”。 – Thilo

+0

我发现你永远不能确定要通过什么而不是“跳过”参数。未定义?空值? 0?空串?空物体?阵列? **如果省略参数中没有文字说明的行为,或者没有默认参数,那么您遇到很大麻烦**。如果更新外部库,则无法保持良好睡眠状态。只有上帝,也许图书馆开发人员可以知道如果您通过任何意想不到的事情而不是所需的参数会发生什么。一般来说,如果这种行为没有记录在案,这些错误在你身上 – Dan

+0

这仍然适用于2017年的最新谷歌浏览器版本,所以我upvoting。 – Anonymous

6

只是通过null作为参数值。

补充:你也可以在最后跳过所有后续可选参数要传递真正的价值(在这种情况下,你可以跳过opt_timeoutInterval参数的话)

+2

你确定里面没有'=== undefined'检查吗? – Dan

+0

@丹,你用这段代码作为一个通用JavaScript问题的例子说明了你的问题。如果您需要特别关于'goog.net.XhrIo.send()'如何工作的帮助,请重新提出这个问题。 – nnnnnn

+0

非常感谢@nnnnnn,但这真的是一个* generic * JavaScript问题,答案应该适用于* any *的情况。如果没有通用解决方案,请将其发布在您的答案中。 – Dan

1

你是什么意思跳?您可以传入null,并且完全可以忽略尾随参数(在这种情况下为opt_timeoutInterval),但您需要确保您的Cache-Control参数成为第五个参数。

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

如果您并不需要将Cache-Control:

goog.net.XhrIo.send(url); 

其他API带参数的哈希,使可选参数更容易(和命名,因此自我记录的许多参数),但是在位置参数是预期的,你必须去那。

+0

跳过我的意思是生活它空白。也许在这里我们有糟糕的界面设计。关于尾随参数你说得很对。我也知道:1)该函数将在没有第二,第三和第四参数的情况下工作。 2)第三个参数的默认值是“GET”。这里有这么多的话......我认为这是糟糕的功能设计,所以让我们停止 – Dan

+0

这里使用JSON作为传递参数 – Dan

21

简短的回答

最安全的赌注是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"。语义关闭。

随着开发人员继续写日益健全javascript代码,有越来越多的机会,你调用的函数明确为undefined检查参数的值,而不是经典if (aParam) {...}。如果您继续使用nullundefined可互换,那么您将会不稳定,因为它们都碰巧强制为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也不是"number"类型,但它的整个工作是一种不是真正的类型。这就是为什么它是未初始化变量所假定的值,以及函数的默认返回值。