【发布时间】:2014-02-04 22:20:09
【问题描述】:
查看我们的一个项目的源代码,我发现我们在条件语句中使用了三个感叹号的一些地方,如下所示:
if (!!!someVar) {
// ...
}
现在,我知道这不是某种很少使用的运算符,它只是连续三个否定,例如!(!(!someVar)))。我不明白它有什么用 - 在我看来,它可以安全地替换为单个感叹号。以下是我尝试找到!!!a 不等于!a 的情况(直接取自谷歌浏览器控制台):
var a = ''
""
!!!a === !a
true
a = 'string'
"string"
!!!a === !a
true
a = null
null
!!!a === !a
true
a = 12
12
!!!a === !a
true
a = {b: 1}
Object {b: 1}
!!!a.c === !a.c // a.c is undefined here
true
a = []
[]
!!!a === !a
true
a = [1,2]
[1, 2]
!!!a === !a
true
我是否遗漏了一些罕见(或明显)的案例?
【问题讨论】:
-
根据here 给出的答案,
!!似乎是“转换为布尔值”的简写方式,因此!!!转换为否定的布尔值。像你一样,我想不出一个单一的!不会做得那么好...... -
我会说它可能只是通过手动删除括号来“简化”到该表达式中。
-
也许有人认为三个感叹号比一个感叹号更明显?
-
不。
!a已经是一个布尔值,所以!a、!!!a、!!!!!a等都是相同的。 -
人们会说它是为了可读性,但实际上它并不更具可读性。对于为什么要使用 3 个感叹号,这确实不是一个有意义的论点。如果 3 个感叹号比 1 更易读,那么 5 应该比 3 更易读吗?为什么不使用 10001 个感叹号来获得最大的可读性?
标签: javascript