为什么使用“!= null”来测试是否传递参数是不好的

时间:2013-07-16 14:13:33

标签: javascript

从它提到的可维护的JavaScript一书中提到:

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

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

为什么作者认为它不好?

4 个答案:

答案 0 :(得分:9)

对于!= null

undefined为false,它基本上代表x !== null && x !== undefined!=会输入强制类型,其中一个影响就是它将nullundefined视为等效(null == undefined为真)。

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

你是完全正确的,代码可以抵御两种(实际上是三种)可能性:

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

  2. null已通过。

  3. undefined已通过。

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

答案 1 :(得分:0)

不确定。在javascript中,您可以拥有null值和undefined值。他们不一样。检查arg是否有效的快速简便方法可能是:

if (arg4)

这样你检查arg4不是null,不是未定义,不是假。请注意这最后一个条件,你可以在这里有意识地告知虚假价值: - )

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

答案 2 :(得分:0)

我强烈建议观看http://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare - 这是自己创作的人的精彩演讲。

答案 3 :(得分:-1)

因为您可以将任何内容传递给函数,所以 null 。如果您愿意,请执行以下操作:

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

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

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