我们在写 js 代码的时候可能会这么写,或者会看到别人有这样的写法:
this.setState({
visible: !!value,
});
两个 ! 是为了将其值转换为布尔。首先 ! 否定一次,转换值如下:
undefined
totrue
null
totrue
+0
totrue
-0
totrue
''
totrue
NaN
totrue
false
totrue
- 所有其他的表达是 to
false
同样可以参考下面的表格,可能更加直观一些。
数据类型 | 转换为 true 的值 | 转换为 false 的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | “” 空字符串 |
Number | 任何非 0 数字值(包括无穷大) | 0 和 NaN |
Object | 任何对象 | null |
Undefined | n/a | undefined |
我们在否定的基础上再加一个 ! 来否定它就达到了双重否定。可以用这种比较简洁的方式来转换为布尔类型,完全等同于简单版的 ToBoolean 。
当我们需要返回值固定为 Bool 类型的值时使用双重否定可以防止由于 js 类型转换规则坑爹导致莫名其妙的错误问题。