【问题标题】:Skipping optional function parameters in JavaScript跳过 JavaScript 中的可选函数参数
【发布时间】:2011-12-02 12:17:56
【问题描述】:

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

比如我想把这里所有的opt_参数都扔掉:

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

【问题讨论】:

    标签: javascript function-parameter


    【解决方案1】:

    解决方案:

    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。我不知道这到底是做什么的(与undefined 相同?)但它确实看起来最适合“跳过可选参数”。
    • 我发现你永远无法确定要传递什么而不是“跳过”参数。不明确的?空值? 0?空字符串?空物体?大批? 如果没有记录省略参数的行为,或者没有默认参数,你就麻烦了。如果更新外部库,您将无法入睡。只有上帝和库开发人员才能知道如果您传递任何意外而不是必需的参数会发生什么。一般来说,如果没有记录这种行为,那么错误就在你身上
    • 这在 2017 年仍然适用于最新的 google chrome 版本,所以我赞成。
    • 嗨,这很好用,除非函数使用 arguments.length。看这个例子:argl = function() { return arguments.length; }  argl(1) => 1  argl(1, undefined, undefined) => 3 argl(1, undefined, 2) => 3
    • npm 模块 oracledb 大量使用 arguments.length。主要是决定是否给出回调。不幸的是,undefined 不是调用这些方法的选项。需要引入一个if 来选择正确的参数列表长度wtf
    【解决方案2】:

    简答

    最安全的选择是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 代码,与经典的 if (aParam) {...} 相比,您调用的函数显式检查 undefined 的参数值的可能性越来越大。如果您继续将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" 类型,但它的全部工作就是成为一个不是真正类型的类型。这就是为什么它是未初始化变量假定的值,以及函数的默认返回值。

    【讨论】:

      【解决方案3】:

      只需将null 作为参数值传递即可。

      补充:你也可以跳过你想要传递真实值的最后一个可选参数(在这种情况下你可以跳过opt_timeoutInterval参数)

      【讨论】:

      • 你确定里面没有`=== undefined`检查吗?
      • @Dan,您将问题表述为通用 JavaScript 问题,并以该代码为例。如果您需要有关 goog.net.XhrIo.send() 工作原理的具体帮助,请重新表述问题。
      • 非常感谢@nnnnnn,但这确实是一个通用 JavaScript 问题,答案应该适用于any 情况。如果没有通用解决方案,请将其发布在您的答案中。
      • @Dan,我不能确定,实现goog.net.XhrIo.send 方法的开发人员如何检查可选参数。他可能会检查param === undefinedtypeof param === "undefined"param === null 或事件只是if(param)。但是当你传递空值时,这表明你意识到这个参数是可选的,并且明确地告诉你不想传递任何有意义的值。
      • 您可以传递 undefined 而不是 null,它可能更适用于更多情况,但我不确定是否有适用于 any 情况的答案。如果我正在编写一个带有可选参数的函数,我可能会检查 ==null 以允许 undefined 或 null (除非 null 由于某种原因是合法值),但我可能会检查 arguments 对象的长度,并且我已经看到用===null 检查过的其他代码所以...
      猜你喜欢
      • 2019-11-11
      • 2015-12-07
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      相关资源
      最近更新 更多