【问题标题】:Checking for passed parameters using null - JavaScript使用 null 检查传递的参数 - JavaScript
【发布时间】:2012-08-12 20:58:42
【问题描述】:

这里以函数为例:

function a(b){
    console.log(b != null ? 1 : 2);
}

该代码运行良好,如果传递参数则打印 1,如果不传递参数则打印 2。

但是,JSLint 给了我一个警告,告诉我改用严格等式,即!==。不管传不传参数,使用!==时函数都会打印1。

所以我的问题是,检查参数是否已传递的最佳方法是什么?我不想使用arguments.length,或者实际上根本不想使用arguments 对象。

我试过用这个:

function a(b){
    console.log(typeof(b) !== "undefined" ? 1 : 2);
}

^ 这似乎有效,但这是最好的方法吗?

【问题讨论】:

  • 如果你通过undefined 那么你会得到一个假阴性。 arguments.length(或变体)是查看参数是否通过的唯一方法。
  • @Esailija 如果函数的意图不是明确使用未定义的值,那么 imo 应该没问题。捕获所有可能的用户错误不是函数的责任。
  • @Christoph 如果您真的需要知道是否传递了参数,那就不行了。如果您只想知道参数是否为空或其他,那么!= null !== undefined 等等都一样脆弱和好,这没有防弹。更喜欢!= null 同时检查undefinednull
  • @Esailija 如果函数不接受未定义的值,则参数是否以undefined 的值传递或根本没有参数都无关紧要。但是null 表示传递了一个参数,因为它与undefined 不同,如果没有传递参数,情况就是这样。所以我不会检查!=null
  • 这就是为什么我说如果你真的需要知道 :P 当然不正常需要知道。

标签: javascript function parameters typeof


【解决方案1】:

当不传递任何参数时,bundefined,而不是 null。因此,测试参数b 是否存在的正确方法是:

function a(b){
    console.log(b !== undefined ? 1 : 2);
}

推荐!==,因为如果你使用==!=,null和undefined可以被强制相等,但是使用!=====不会做类型强制,所以你可以严格判断它是否是undefined 与否。

【讨论】:

  • 为了完整起见,可以去掉函数内部的typeof,因为我们在函数范围内,这里不能覆盖undefined :) 在全局范围内,使用typeof(foo) !== "undefined" 更安全。
【解决方案2】:

您可以使用undefined 的虚假性质(一个未传递的参数实际上是undefined,而不是null),然后写:

(!b)?1:2

不过,0null""(假值)也是如此。

如果你想用防弹的方式来写,你可以去:

typeof(b) === "undefined"
// or thanks to the write protection for undefined in html5
b === undefined

更新:感谢 EcmaScript 2015,我们现在可以使用 default parameters

function a(b = 1){
    console.log(b);
}

如果一个参数是未定义的——无论是省略还是明确地移交(在这里你应该使用null)——将使用默认值,所有其他值保持不变(也是假值)。 Demonstration

【讨论】:

  • 顺便说一句,如果你想为未传递给函数的变量使用默认值,你可以写像b = b || defaultValue这样的东西。这是if(!b){b = defaultValue;} 的常见JS 习惯用法——具有与上述相同的限制(如果b0falsenullundefined"",则!b 为真)。
  • @jakub.g 这是个坏主意,因为您永远不能以这种方式将0"" 作为参数传递。使用默认值时,您应该以安全的方式检查它,而不是使用虚假性质。
  • 没错。然而,当预期的参数应该是一个对象 (b = b || {}) 时更有意义。
  • @Keir Simmons 我冒昧地更新了对最近 Ecmascript 标准的答案。随意看看;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多