2013-07-16 104 views
8

从书中测试可维护的JavaScript它提到:为什么它是不好的使用,如果参数传递

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

,但我觉得用!= null这里是相当有效的,它过滤无论是没有通过参数的情况下,或通过为空

为什么作者建议它是坏的任何理由?

+4

我们应该如何知道作者的想法?问作者! –

+0

我认为这个建议是有用的,因为区分'null'和没有参数是有用的。 “未定义”通常意味着“尚未赋予值”,而“空值”通常意味着“故意给予无值”。 – apsillers

+0

解释在具有您发布的代码的页面之前。 – j08691

回答

8

!= null对于undefined是错误的,它基本上意味着x !== null && x !== undefined!=确实类型强制,并且其中一个影响是它将nullundefined视为等效(null == undefined为true)。

所以除非你想要,否则有人建议不要使用!=null(或undefined)。

你说的很对,代码抵御两(以及实际上有三个)的可能性:在所有

  1. 没有传递的参数

  2. null通过。

  3. undefined通过。

但评论说,这是一个糟糕的方式来测试一个参数是否获得通过,它是:因为它没有赶上通过nullundefined。 (通过null而不通过任何东西都是不同的情况。)这并不一定意味着检查特定函数的参数是一种坏方法。

-1

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

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

你会传递参数,但因为通过引用您的检查将失败。始终使用以下内容:

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

为什么检查失败?似乎清楚的是,代码还打算防止'null'。 –

+0

公平起见,'obj = undefined' *应该与删除参数相同。你应该解决'null'和'undefined'之间的区别。 – apsillers

+0

@CrazyTrain原代码示例的作者试图解释*,除非你想防范'null' *,否则不要检查'!= null'。针对'null'的检查被提供(在这种情况下)作为代码的*缺陷*,其中实际意图仅仅是测试定义参数的数量。 – apsillers

0

当然。在JavaScript中,您可以有null值和undefined值。他们不一样。快速和简单的方法来检查,如果arg是有效的将可能是:

if (arg4)

而且这样你检查ARG4不为空,而不是不确定的,而不假。请注意这最后一个条件,你可能在这里有意识地通知一个虚假的值:-)

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

+0

最好的答案,除非ARG4是一个布尔值:) – EkoostikMartin

+6

*“最好的检查,如果arg是有效的将可能是办法” *不,那也将淘汰'“”','0','NaN'和'false'(除了'null'和'undefined')。有很多时候这会咬你。这是对可选的* object *参数的一个很好的检查,但除此之外,它会变得很冒险。 (不是我的dv) –

相关问题