我们在写 js 代码的时候可能会这么写,或者会看到别人有这样的写法:

this.setState({
  visible: !!value,
});

两个 ! 是为了将其值转换为布尔。首先 ! 否定一次,转换值如下:

  • undefined to true
  • null to true
  • +0 to true
  • -0 to true
  • '' to true
  • NaN to true
  • false to true
  • 所有其他的表达是 to false

同样可以参考下面的表格,可能更加直观一些。

数据类型 转换为 true 的值 转换为 false 的值
Boolean true false
String 任何非空字符串 “” 空字符串
Number 任何非 0 数字值(包括无穷大) 0 和 NaN
Object 任何对象 null
Undefined n/a undefined

我们在否定的基础上再加一个 ! 来否定它就达到了双重否定。可以用这种比较简洁的方式来转换为布尔类型,完全等同于简单版的 ToBoolean

当我们需要返回值固定为 Bool 类型的值时使用双重否定可以防止由于 js 类型转换规则坑爹导致莫名其妙的错误问题。