我绝不是 Javascript 方面的专家,但我一直在阅读 Mark Pilgrim 的“Dive into HTML5”网页,他提到了一些我希望更好地理解的内容。
他说:
最后,您使用双重否定技巧将结果强制为布尔值(真或假)。
function supports_canvas() {
return !!document.createElement('canvas').getContext;
}
如果有人能更好地解释这一点,我将不胜感激!
我绝不是 Javascript 方面的专家,但我一直在阅读 Mark Pilgrim 的“Dive into HTML5”网页,他提到了一些我希望更好地理解的内容。
他说:
最后,您使用双重否定技巧将结果强制为布尔值(真或假)。
function supports_canvas() {
return !!document.createElement('canvas').getContext;
}
如果有人能更好地解释这一点,我将不胜感激!
当放置在需要布尔值的上下文中时,Javascript 对什么被认为是“真”和“假”有一组令人困惑的规则。但是逻辑非运算符 ,!
总是产生一个正确的布尔值(常量true
和 之一false
)。通过链接它们中的两个,习语!!expression
产生了一个与原始表达式具有相同真实性的正确布尔值。
你为什么要打扰?因为它使您展示的功能更加可预测。如果那里没有双重否定,它可能会返回undefined
一个Function
对象,或者与Function
对象完全不同的东西。如果这个函数的调用者对返回值做了一些奇怪的事情,整个代码可能会出错(“奇怪”在这里意味着“除了强制执行布尔上下文的操作之外的任何事情”)。双重否定的习语阻止了这一点。
在 javascript 中,如果给定值是真、1、非空等,使用“bang”运算符 (!) 将返回真。如果值是未定义、空、0 或空字符串,它将返回假。
因此 bang 运算符将始终返回一个布尔值,但它将表示与您开始时相反的值。如果您获取该操作的结果并再次“敲打”它,您可以再次反转它,但最终仍会得到一个布尔值(而不是未定义、空值等)。
使用 bang 两次将采用一个可能是 undefined、null 等的值,并使其变得简单false
。它将采用一个可能是 1、“true”等的值,并使其变得简单true
。
代码可以写成:
var context = document.createElement('canvas').getContext;
var contextDoesNotExist = !context;
var contextExists = !contextDoesNotExist;
return contextExists;
使用 !!variable 可以保证将类型转换为布尔值。
给你一个简单的例子:
"" == false (is true)
"" === false (is false)
!!"" == false (is true)
!!"" === false (is true)
但是,如果您正在执行以下操作,则使用没有意义:
var a = ""; // or a = null; or a = undefined ...
if(!!a){
...
if 将其强制转换为布尔值,因此无需进行隐式双重否定转换。
!
将 "something"/"anything" 转换为boolean
.
!!
返回原始布尔值(并保证表达式现在是布尔值,无论之前是什么)