JavaScript逻辑运算符: ?

3

我正在研究underscore.js的源代码,发现了这个:

_.isRegExp = function(obj) {
    return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
};

为什么要使用"!!"?它应该被理解为NOT-NOT吗,还是在这里存在一些神秘的JS细微差别?

1
它被称为速记法,而不是JS的玄妙之处。就像“+”运算符用于转换为数字(例如:“+“0””),而“+”“”用于转换为字符串一样。 - HoLyVieR
1
可能是 JavaScript 中的 !! 运算符是什么? 的重复问题。 - Crescent Fresh
4个回答

12

这只是将结果转换为布尔值的一种笨拙方式。


2
是的,它是“非非”。这是一种常用的习语,将一个值转换为等效的布尔值。JavaScript将0.0、''、null、undefined和false视为假值,而将任何其他值(包括true)视为真值。这个习惯用法将前面提到的所有假值转换为布尔值false,将后面提到的所有真值转换为布尔值true。在这种特殊情况下,
a && b

如果ab都为真值,将返回b
!!(a && b)

如果ab都是真值,将返回true


1
你忘记了 NaN(作为假值)。 - user113716

1

&& 运算符返回 false 或表达式中的最后一个值:

("a" && "b") == "b"

|| 运算符返回第一个被判定为真的值

("a" || "b") == "a"

逻辑非运算符返回一个布尔值

!"a" == false

如果你想将一个变量转换为布尔值,可以使用!!

var myVar = "a"
!!myVar == true

myVar = undefined
!!myVar == false

等等。


0

这只是两个相邻的!运算符。但是双重否定是毫无意义的,除非您像使用!!一样将其转换为布尔类型。

它将把任何东西转换为true或false...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接