为什么使用"空”;以测试是否传递了参数
Why it is not good to use "!= null" to test if argument is passed
在《可维护的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
。!=
进行类型强制,其效果之一是将null
和undefined
视为等价(null == undefined
为真)。
因此,除非您愿意,否则有些人建议不要将!=
与null
(或undefined
)一起使用。
你说得很对,代码抵御了两种(实际上是三种)可能性:
-
根本没有为参数传递任何东西。
-
null
通过。 -
undefined
通过。
但评论说,这是一种测试参数是否通过的糟糕方法,它是:因为它无法捕捉到通过null
或undefined
。(传入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')
// ...
- 测试索引值是否等于某个数字的倍数
- 测试mongo脚本中是否存在参数
- 测试对象是否相等和/或对象是否有更多的关键点,但仍然与共同的关键点相等
- node.js测试事件是否是在不使用超时的情况下使用sinon.js发出的
- 如何测试主干视图是否正确侦听特定事件
- 2端测试是否足够
- javascript测试是否存在两个标志中的任何一个
- 我如何为列出的选项卡元素编写一个Protractor测试,它会检查它是否's是否处于活动状态
- 如何测试选择器是否存在于CasperJS中
- 是否可以测试javascript函数是否是构造函数
- 如何测试变量是否只有字母而不是abc1.关于验证电子邮件
- jQuery-有没有一种方法可以测试函数是否异步
- 如何测试HTML元素的祖先是否有CSS类
- 如何测试jQuery和某些其他脚本是否已加载
- Javascript 测试是否设置了变量
- 是否可以模拟 qUnit 测试的窗口位置对象
- 测试JavaScript是否符合异常变量名
- 测试两个版本的 json 架构是否向后兼容
- 如何测试指令是否发出事件
- 测试两个变量是否包含一些数据 JavaScript