我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式,像这样:!!。有人能告诉我这个接线员做什么吗?
我看到这件事的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
我看到一些代码似乎使用了我不认识的运算符,以两个感叹号的形式,像这样:!!。有人能告诉我这个接线员做什么吗?
我看到这件事的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
当前回答
它将后缀转换为布尔值。
其他回答
JavaScript中的一些运算符执行隐式类型转换,有时用于类型转换。
一元!运算符将其操作数转换为布尔值并对其求反。
这一事实导致了以下习惯用法,您可以在源代码中看到:
!!x // Same as Boolean(x). Note double exclamation mark
!! 同时使用NOT操作两次!将值转换为布尔值并将其反转,因此使用两次,显示该值的布尔值(false或true)。这里有一个简单的例子来看看如何!!作品:
首先,您所处的位置:
var zero = 0;
那你做了!0。它将被转换为布尔值,并被计算为真,因为0是假的,因此您将得到相反的值并被转换为Boolean,因此它被计算为true。
!zero; //true
但是我们不希望值的布尔值反转,所以我们可以再次反转以获得结果!这就是为什么我们使用另一个!。
大体上使我们确定我们得到的值是布尔值,而不是假值、真值、字符串等。。。
因此,这就像在JavaScript中使用布尔函数,但将值转换为布尔值的方法更简单、更短:
var zero = 0;
!!zero; //false
有时,有必要检查函数中是否有值,数量本身对我们来说并不重要,但它是否重要。
例如,我们想检查用户是否有专业,并且我们有一个如下的功能:
hasMajor() {return this.major} // It returns "(users major is) Science"
但答案对我们来说并不重要。我们只想检查它是否有主,我们需要一个布尔值(true或false)。我们如何得到它?
就像这样:
hasMajor() { return !(!this.major)}
或相同
hasMajor() {return !!this.major)}
如果this.major有值,那么!this.major返回false,但因为值有出口,我们需要返回true,所以我们使用!两次返回正确答案!(!this.major)。
在看到所有这些伟大的答案后,我想补充一个使用!!的理由!!。目前,我正在使用Angular 2-4(TypeScript),当我的用户未通过身份验证时,我希望将布尔值返回为false。如果他未通过身份验证,则令牌字符串将为null或“”。我可以通过使用下一段代码来实现这一点:
public isAuthenticated(): boolean {
return !!this.getToken();
}
这是一种非常晦涩的类型转换方法。
! 表示不。所以真是假的,而且!假是真!0为真,并且!1为假。
所以你要将一个值转换成布尔值,将其反转,然后再次反转。
// 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);
注意:由于!=运算符的作用以及哪些值被认为是正确的。