JavaScript 中的 !!(非非)运算符是什么?
2009-04-24
945643
我看到了这段代码:
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
它似乎使用
!!
作为运算符,我不认识它。它起什么作用?
3个回答
它将
Object
转换为
boolean
。如果它为假值(例如
0
、
null
、
undefined
等),它将为
false
,否则为
true
。
!object // Inverted Boolean
!!object // Noninverted Boolean, so true Boolean representation
因此
!!
不是运算符;它只是两次
!
运算符。
通常这样做更简单:
Boolean(object) // Boolean
真实世界示例“测试 IE 版本”:
const isIE8 = !! navigator.userAgent.match(/MSIE 8.0/);
console.log(isIE8); // Returns true or false
如果你 ⇒
console.log(navigator.userAgent.match(/MSIE 8.0/));
// Returns either an Array or null
但如果你 ⇒
console.log(!!navigator.userAgent.match(/MSIE 8.0/));
// Returns either true or false
stevehipwell
2009-04-24
这是进行类型转换的一种非常晦涩难懂的方法。
!
表示
NOT
。因此
!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
2009-09-10
!!expr
(两个
!
运算符后跟一个表达式)将表达式的
真值
返回为
true
或
false
。
在非布尔表达式上使用时很有意义。一些示例:
注意:
Boolean
函数产生完全相同的结果,并且更具可读性。
!!false // false
!!true // true
!!0 // false
!!parseInt("foo") // false — NaN is falsy
!!1 // true
!!-1 // true — negative number is truthy
!!(1/0) // true — Infinity is truthy
!!"" // false — empty string is falsy
!!"foo" // true — non-empty string is truthy
!!"false" // true — ...even if it contains a falsy value
!!window.foo // false — undefined value is falsy
!!undefined // false — undefined primitive is falsy
!!null // false — null is falsy
!!{} // true — an (empty) object is truthy
!![] // true — an (empty) array is truthy
Salman Arshad
2012-05-15