我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式,像这样:!!。有人能告诉我这个接线员做什么吗?
我看到这件事的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式,像这样:!!。有人能告诉我这个接线员做什么吗?
我看到这件事的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
当前回答
这里有很多很棒的答案,但如果你读到这里,这帮助我“找到答案”。在Chrome(等)中打开控制台,然后开始键入:
!(!(1))
!(!(0))
!(!('truthy'))
!(!(null))
!(!(''))
!(!(undefined))
!(!(new Object())
!(!({}))
woo = 'hoo'
!(!(woo))
...etc., etc., until the light goes on ;)
当然,这些都和仅仅打字一样!!但添加的括号可能有助于使其更易于理解。
其他回答
它将后缀转换为布尔值。
我怀疑这是C++遗留下来的东西,在那里人们会重写!运算符,但不是布尔运算符。
因此,在这种情况下,要获得否定(或肯定)答案,首先需要使用!运算符来获取布尔值,但如果您想检查正数,则可以使用!!。
要将JavaScript变量转换为布尔值,
var firstname = "test";
// Type of firstname is string
var firstNameNotEmpty = !!firstname;
// Type of firstNameNotEmpty is Boolean
JavaScript false表示“”、0、undefined和null。
JavaScript对于除零以外的数字是真的,而不是空字符串、{}、[]和new Date(),因此,
!!("test") /* Is true */
!!("") /* Is false */
!! 不是运算符。这只是!操作员两次。
但使用JavaScript,应用!!在大多数情况下,将Object转换为Boolean是冗余和冗长的,因为:
值未定义或为空的任何对象,包括值为false的布尔对象,传递给有条件的陈述
示例:if({}){console.log(“{}是true”)}//logs:“{}是true”
这个问题已经得到了非常彻底的回答,但我想补充一个答案,我希望这个答案尽可能简化,使!!尽可能简单地掌握。
因为JavaScript具有所谓的“truthy”和“falsy”值,所以有些表达式在其他表达式中求值时会导致true或false条件,即使所检查的值或表达式实际上不是true或false。
例如:
if (document.getElementById('myElement')) {
// Code block
}
如果该元素确实存在,则表达式将求值为true,并执行代码块。
然而:
if (document.getElementById('myElement') == true) {
// Code block
}
…将不会导致真条件,并且代码块将不会被执行,即使元素确实存在。
为什么?因为document.getElementById()是一个“truthy”表达式,它在这个if()语句中的值为true,但它不是一个真正的布尔值true。
在这种情况下,双“not”相当简单。这只是背靠背的两个不。
第一个简单地“反转”真值或假值,产生实际的布尔类型,然后第二个简单地将其“反转”回原始状态,但现在是实际的布尔值。这样你就有了一致性:
if (!!document.getElementById('myElement')) {}
and
if (!!document.getElementById('myElement') == true) {}
将如预期的那样返回true。