【问题标题】:Why it is not good to use "!= null" to test if argument is passed [duplicate]为什么使用“!= null”来测试参数是否通过是不好的[重复]
【发布时间】:2013-07-14 18:36:11
【问题描述】:

来自它提到的《可维护的 JavaScript》一书:

// Bad: Testing to see if an argument was passed
function doSomething(arg1, arg2, arg3, arg4){
if (arg4 != null){
    doSomethingElse();
  }
}

但我觉得这里使用!= null 还是很有效的,它过滤了参数未传递或作为null 传递的情况

作者为什么认为它不好?

【问题讨论】:

  • 我们怎么知道作者在想什么?问作者!
  • 我认为提供此建议是因为区分null 和无参数很有用。 undefined 通常表示“尚未给出值”,而null 通常表示“故意给出没有值”。
  • 解释在您发布的代码之前的页面上。
  • 一点也不差,可能是== 最合适的用法之一。但最终这取决于您要防范什么。

标签: javascript


【解决方案1】:

!= nullundefined 来说是假的,它基本上意味着x !== null && x !== undefined!= 确实类型强制,其影响之一是它将nullundefined 视为等效(null == undefined 为真)。

因此,除非您愿意,否则有些人建议不要将!=null(或undefined)一起使用。

您说得对,代码可以防御两种(实际上是三种)可能性:

  1. 没有为参数传递任何内容

  2. null 已通过。

  3. undefined 已通过。

但是评论说这是测试参数是否通过的不好方法,它是:因为它没有捕获通过 nullundefined。 (传入 null 和不传入 anything 是不同的情况。)这并不一定意味着检查特定函数的参数是一种不好的方法。

【讨论】:

    【解决方案2】:

    因为你可以将任何东西传递给函数,也可以 null。如果您愿意:

    var obj = new MyObject();
    // ...
    obj = null;
    // ...
    doSomething(arg1, arg2, arg3, obj);
    

    你会传递一个参数,但你的检查会失败,因为传递的引用是 null。始终使用以下内容:

    if(typeof arg4 != 'undefined')
        // ...
    

    【讨论】:

    • 为什么会检查失败?似乎很清楚,该代码还打算防范null
    • 公平地说,obj = undefined 应该等同于省略参数。您应该解决nullundefined 之间的区别。
    • @CrazyTrain 原始代码示例的作者试图解释除非你想防范null,否则不要检查!= null。检查null(在这种情况下)作为代码的缺陷提供,其中实际意图只是测试已定​​义参数的数量。
    • @apsillers:所以作者说不要排除您想要包含的值。好建议。
    【解决方案3】:

    当然。在 javascript 中,您可以拥有 null 值和 undefined 值。而且它们不一样。检查 arg 是否有效的一种快速简便的方法可能是:

    if (arg4)

    这样你检查 arg4 不为空,不为未定义,并且不为假。请注意最后一个条件,您可能会在此处有意识地告知错误值:-)

    编辑:T.J.克劳德就在这里。它很容易使用,并且在大多数情况下都可以使用,但要小心。

    【讨论】:

    • 最佳答案,除非 arg4 是布尔值 :)
    • “检查 arg 是否有效的最佳方法可能是” 不,这也会淘汰 ""0NaNfalse(除了nullundefined)。很多时候,它会咬你。这是对可选 object 参数的一个很好的检查,但除此之外,它变得很冒险。 (不是我的 dv)
    【解决方案4】:

    我强烈建议您观看http://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare - 一个由他自己创建的人关于这个问题的精彩演示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 2022-12-14
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多