JavaScript中返回值上的双感叹号符号

18

我正在查看一本关于HTML 5的书,其中包含以下JavaScript代码片段。双感叹号代表什么意思?

return ! ! document.createElement('video').canPlayType;

4
编程语言中,双重否定很有用。我的英语老师说不要使用双重否定,但是“我不想什么都不做”这句话现在或许有意义了。 :) - John Hartsock
1
在提问之前,先尝试搜索stackoverflow可能是个好主意。https://dev59.com/jXRA5IYBdhLWcg3w6SRH - KooiInc
1
抱歉。我在“双感叹号点JavaScript”下进行了搜索,但没有找到任何结果。 - steve
2个回答

23

! 运算符表示取反,而第二个 ! 会对初始的取反结果再次取反。这基本上将右侧的任何内容强制转换为布尔值(true 或 false)。

!false // true
!!false // false

因此,如果该方法被定义,则会将 function 强制转换为 true

document.createElement('video').canPlayType

因此,上述代码返回一个函数。我们不想要一个函数,而是想要一个明确的布尔值,所以我们对其进行两次否定操作,由于 function 不是假值 (0、null、false、空字符串、NaN),因此它会在支持该方法的浏览器中返回 true。

!!document.createElement('video').canPlayType // true
如果该方法不受支持,浏览器将返回undefined! undefined为真,!true为假,因此!!document.createElement('video').LOL将返回false

document.createElement('video').canPlayType 不会返回布尔值吗?还是说如果它是 null,那么 !!(null) = false - hunter
@hunter - 如果浏览器不支持视频标签,document.createElement('video').canPlayType将返回未定义。 - James Kovacs
JavaScript很蠢... !null应该抛出异常... 真糟糕。 - hunter

9
双感叹号是 JavaScript 中的一个技巧,可以返回 true/false,无论输入是什么。在您的例子中,如果浏览器不支持 video 标签,则会返回 undefined。!undefined 是 true。因此 !!undefined 是 false。如果浏览器支持 video,则会返回 true。!!true 也是 true。这样可以避免处理 undefined 的情况。

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