有必要使用双感叹号(!!)来确保对象不是null吗

Is it necessary to use double exclamation points (!!) in order to make sure that an object is not null?

本文关键字:确保 对象 null 感叹      更新时间:2023-09-26

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

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

对此有什么意见吗?我希望我的代码是安全的,不会陷入空指针异常和其他事情可能发生的情况,但我也想让我的代码可读。

您正在做的事情已经由JavaScript原生完成了。

if( value ) { }

只要value不是:

  • null
  • 未定义的
  • NaN
  • 空字符串("(
  • 0
  • 虚假的

请查看规范中的tooolean转换。

不,如果在if中使用变量作为条件,则根本不需要双爆炸。简单地if (name)就足以确保name不是falsy值。所有对象引用都是真实的;null是伪造的。

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

switch (true) {
  case foo:

应该是

switch (true) {
  case !!foo:

或者,使用详细但可读性更强的Boolean(foo)(不要将new与基元构造函数一起使用(。请注意,相反的情况并非如此,如果您正在测试伪值,那么这将成为一个问题,因为0、NaN和空字符串(可能是有效值(都是伪值:

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

然而,JavaScript为您提供了一个涉及松散等式的选项(有些人对此表示不满(,nullundefined彼此松散等效,但与任何其他伪值无关:

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

完全。。。毫无意义,用一个双关语来说。

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

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

!!有时用于将某个值强制为boolean。。

例如:

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