是否有必要使用双感叹号(!!)以确保对象不为空?

时间:2016-10-21 17:24:23

标签: javascript

我最近开始在对象之前使用双惊叹号!!来确保它不是null并且它不是未定义的而不是空字符串,以确保我包含所有不同的方式变量可以为空。

这有必要吗?例如,它很难阅读: if(!!name) vs if(name)

对此有何看法?我希望我的代码是安全的,而不是进入可能发生空指针异常和其他事情的条件,但我也希望我的代码可读。

4 个答案:

答案 0 :(得分:4)

不,如果您将变量用作if中的条件,则根本不需要双重爆炸。只需if (name)就可以确保name不是 falsy 值。所有对象引用都是真实的; null是假的。

答案 1 :(得分:3)

除非您需要与布尔true进行严格比较,否则完全没有必要,例如:

switch (true) {
  case foo:

应该是

switch (true) {
  case !!foo:

或者替代地,详细但更具可读性Boolean(foo)(不要将new与原始构造函数一起使用)。请注意,相反的情况并非如此,如果您正在测试falsey值,那么它就会成为问题,因为0,NaN和空字符串(可能是有效值)都是假的:

if (!foo) { // foo had better not be empty string or zero

然而,JavaScript为你提供了一个(有些皱眉)涉及松散的平等,nullundefined彼此松散等同但不与任何其他假名值:

null == undefined //true
null == NaN // false
undefined == '' // false

答案 2 :(得分:2)

您正在做的事情已经由JavaScript本地完成。

if( value ) { }

只要value不是,

就会评估为真。

  • 未定义
  • 的NaN
  • 空字符串(“”)
  • 0

Check out the toboolean conversions in the specification.

答案 3 :(得分:1)

完全和完全......毫无意义,使用小双关语。

if()自动将条件值转换为布尔值。

!!也将它转换为布尔值。

有时使用!!的地方是强迫boolean值。

如:

var hasElement == !!document.getElementById("zz");