我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式出现,如下所示: !!
.有人可以告诉我这个操作员是做什么的吗?
我看到这个的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
原文由 Hexagon Theory 发布,翻译遵循 CC BY-SA 4.0 许可协议
我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式出现,如下所示: !!
.有人可以告诉我这个操作员是做什么的吗?
我看到这个的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
原文由 Hexagon Theory 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是进行类型转换的一种非常晦涩的方法。
!
表示 _不_。所以 !true
是 false
,而 !false
是 true
!0
是 true
,和 !1
是 false
因此,您要将一个值转换为布尔值,将其取反,然后再次取反。
// Maximum Obscurity:
val.enabled = !!userId;
// Partial Obscurity:
val.enabled = (userId != 0) ? true : false;
// And finally, much easier to understand:
val.enabled = (userId != 0);
// Or just
val.enabled = Boolean(userId);
注意: 当涉及到某些边缘情况时,后两个表达式并不完全等同于第一个表达式(例如,当 userId
是 []
时),由于 !=
运算符有效,哪些值被认为是 真实 的。
原文由 Tom Ritter 发布,翻译遵循 CC BY-SA 4.0 许可协议
13 回答13k 阅读
7 回答2.2k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
6 回答1.1k 阅读
它将
Object
转换为boolean
。如果它是错误的(例如,0
、null
、undefined
等),则为false
,否则为true
。所以
!!
不是操作员;这只是!
操作员两次。这样做可能更简单:
真实世界示例“测试 IE 版本”:
如果你⇒
但是如果你⇒