我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式,像这样:!!。有人能告诉我这个接线员做什么吗?
我看到这件事的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式,像这样:!!。有人能告诉我这个接线员做什么吗?
我看到这件事的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
当前回答
这个构造是将任何JavaScript表达式转换为它的布尔等价物。
例如:!!“他击落了我”==真的!!0===假。
其他回答
在看到所有这些伟大的答案后,我想补充一个使用!!的理由!!。目前,我正在使用Angular 2-4(TypeScript),当我的用户未通过身份验证时,我希望将布尔值返回为false。如果他未通过身份验证,则令牌字符串将为null或“”。我可以通过使用下一段代码来实现这一点:
public isAuthenticated(): boolean {
return !!this.getToken();
}
这里有很多很棒的答案,但如果你读到这里,这帮助我“找到答案”。在Chrome(等)中打开控制台,然后开始键入:
!(!(1))
!(!(0))
!(!('truthy'))
!(!(null))
!(!(''))
!(!(undefined))
!(!(new Object())
!(!({}))
woo = 'hoo'
!(!(woo))
...etc., etc., until the light goes on ;)
当然,这些都和仅仅打字一样!!但添加的括号可能有助于使其更易于理解。
我只是想补充一下
if(variableThing){
// do something
}
与
if(!!variableThing){
// do something
}
但当某些东西未定义时,这可能是一个问题。
// a === undefined, b is an empty object (eg. b.asdf === undefined)
var a, b = {};
// Both of these give error a.foo is not defined etc.
// you'd see the same behavior for !!a.foo and !!b.foo.bar
a.foo
b.foo.bar
// This works -- these return undefined
a && a.foo
b.foo && b.foo.bar
b && b.foo && b.foo.bar
这里的技巧是,&&s链将返回它找到的第一个假值,这可以被馈送到if语句等。因此,如果b.foo未定义,它将返回undefined并跳过b.foo.bar语句,我们不会得到任何错误。
上面的返回未定义,但如果您有一个空字符串,false,null,0,undefined,这些值将返回,一旦我们在链中遇到它们——[]和{}都是“truthy”,我们将沿着所谓的“&&链”继续到右边的下一个值。
P.S.执行上述(b&&b.foo)的另一种方法是(b||{}).foo。这些方法是等效的,因为如果b未定义,则b||{}将为{},并且您将访问空对象中的值(无错误),而不是尝试访问“undefined”中的值。
因此,(b||{}).foo与b&&b.foo相同,((b||{})/foo||{}).bar与b&&b.foo&&b.foo.bar相同。
这个问题已经得到了非常彻底的回答,但我想补充一个答案,我希望这个答案尽可能简化,使!!尽可能简单地掌握。
因为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。
记住JavaScript中对true和false的求值很重要:
具有“价值”的一切都是真实的(即真实的),例如:101,3.1415,-11,“幸运的大脑”,新建对象()当然,这是真的没有“Value”的所有内容都是假的(即falsy),例如:0,-0,“”(空字符串),未定义,无效的NaN(不是数字)当然,也是假的
应用“逻辑非”运算符(!)计算操作数,将其转换为布尔值,然后对其求反。应用两次将对求反进行求反,从而有效地将值转换为布尔。不应用运算符将只是精确值的常规赋值。示例:
var value = 23; // number
var valueAsNegatedBoolean = !value; // boolean falsy (because 23 is truthy)
var valueAsBoolean = !!value; // boolean truthy
var copyOfValue = value; // number 23
var value2 = 0;
var value2AsNegatedBoolean = !value2; // boolean truthy (because 0 is falsy)
var value2AsBoolean = !!value2; // boolean falsy
var copyOfValue2 = value2; // number 0
value2=值;指定精确的对象值,即使它不是布尔值,因此value2不一定最终是布尔值。value2=!!价值作为操作数值的双重否定的结果,指定一个保证布尔值,它相当于以下内容,但要短得多,可读性强:
if(值){value2=真;}其他{value2=false;}