为什么使用"空”;以测试是否传递了参数

Why it is not good to use "!= null" to test if argument is passed

本文关键字:是否 测试 参数 quot 为什么      更新时间:2023-09-26

在《可维护的JavaScript》一书中提到:

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

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

作者认为它不好的原因是什么?

!= null对于undefined是false,它基本上意味着x !== null && x !== undefined!=进行类型强制,其效果之一是将nullundefined视为等价(null == undefined为真)。

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

你说得很对,代码抵御了两种(实际上是三种)可能性:

  1. 根本没有为参数传递任何东西

  2. null通过。

  3. undefined通过。

但评论说,这是一种测试参数是否通过的糟糕方法,它是:因为它无法捕捉到通过nullundefined。(传入null和不传入任何是不同的情况。)这并不一定意味着检查特定函数的参数是一种糟糕的方法。

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

if (arg4)

通过这种方式,您可以检查arg4是否为null,是否未定义,并且是否为false。请注意最后一种情况,您可能会有意识地在此处通知错误值:-)

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

我强烈建议观看http://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare——这是一个由他自己创造的人对这件事的精彩陈述。

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

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

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

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