代码之家  ›  专栏  ›  技术社区  ›  Jakob

处理javascript中未定义参数和空参数之间的区别

  •  14
  • Jakob  · 技术社区  · 15 年前

    我非常清楚,在JavaScript中,空值和未定义值是不同的。然而,当我自己的函数被作为参数传递时,我似乎无法决定是否使用这个事实。

    或者用另一种方式表达,应该 myFoo(undefined) 返回与相同的内容 myFoo(null) ?

    或者,在另一种情况下,因为 myBar(1, 2, 3) 几乎和 myBar(1, 2, 3, undefined, undefined) 应该 myBar(1, 2, 3, null, null) 返回与相同的内容 MyBar(1, 2, 3) ?

    我认为在这两种情况下都有可能出现混淆,并且在处理空/未定义时,库可能应该遵循约定。

    我不是真的在征求个人意见(所以请把这些作为评论而不是答案来表达)。我在问,是否有人知道在处理这种区别时,是否应该坚持最佳实践。欢迎参考外部资源!

    3 回复  |  直到 15 年前
        1
  •  11
  •   Ben Blank Jarret Hardie    15 年前

    我想说的是,虽然在大多数情况下,区分这两种情况的价值很小 价值往往很有趣。

    以一个函数为例,它可以被给予一个回调。 undefined 可能指示应使用某些默认回调(就像未指定参数一样),但 null 可能表示根本不应进行回调:

    function asyncWorker(data, callback, timeout) {
        if (typeof callback === "undefined") {
            callback = function() { $("#log").append("<p>Done!</p>"); };
        }
    
        // ...
    
        if (callback) callback();
    }
    
    asyncWorker([1, 2, 3]); // default callback, no timeout
    asyncWorker([4, 5, 6], null); // no callback, no timeout
    asyncWorker([7, 8, 9], undefined, 10000); // default callback, 10s timeout
    

    当然, false 0 可以代替 无效的 在这里,但在一个更复杂的例子中可能不是这样。您的代码是否能从额外的参数复杂性中获益完全取决于您自己。-)

        2
  •  2
  •   Sean Kinsey    15 年前

    处理参数的最佳实践

    • 定义期望的参数、它们将用于什么以及这些参数的类型
    • 决定 怎样 它们可以通过 正式的 或者通过 arguments 收集
    • 定义超出预期范围的值是否应导致默认值
    • 在处理之前验证参数是否在范围内
    • 对于布尔值,决定它们是否必须是真正的布尔值,或仅是 真/假

    在这种情况下,步骤2、3和4对您最重要

    如何访问参数
    这是您需要根据选择的内容 什么 方法是这样的,您的策略是处理可变数量的参数。

    以这个为例

    function foo() {
        var args = arguments.length == 1 ? 
            [document.body].concat([arguments[0]]) : 
            Array.prototype.slice.call(arguments);
    
        args[0].style.backgroundColor = args[1];
    }
    
    foo(document.body, "red");
    foo("blue");​
    

    真布尔或真/假
    如何测试值在很大程度上取决于代码的设置方式

    function foo(elem, color) {
        if (!color) { // the correct test here should be 'typeof color == "undefined"'
            color = "green";
        }
        elem.style.backgroundColor = color;
    }
    
    foo(document.body, "red"); //set the background color to red
    foo(document.body); //set the background color to the default green
    foo(document.body, "");​ //remove the background color !This will fail!
    

    最后一条语句将错误地使用默认值而不是提供的值,即使提供的值在预期范围内。

    当涉及到处理 undefined 价值观记住在 foo(undefined); foo(); 除了 长度 争论 集合将不同。如何处理(如果需要)取决于您如何访问参数。

        3
  •  0
  •   Sean Kinsey    15 年前

    它完全取决于您如何处理传递给函数的参数,所以它取决于您自己。 如果要检查参数是否为 null 你用

    if (myVar === null) { 
    

    如果你想检查一个论点是否 undefined 你用

    if (typeof myVar === "undefined") {
    

    如果期望的参数不是0、空或未定义,则可以使用

    if (myVar) { 
    

    所以不管你是否 myFoo(null) 应该表现得和 myFoo(undefined) 完全取决于您如何在内部处理这些问题。

    当涉及到额外参数时,除了 arguments 集合大于预期。