我绝不是Javascript方面的专家,但我一直在阅读Mark Pilgrim的“Dive into HTML5”网页,他提到了一些我想更好理解的东西。
他州:
最后,使用双重否定技巧将结果强制为布尔值(true或false)。
function supports_canvas() {
return !!document.createElement('canvas').getContext;
}
如果有人能解释得更好一点,我会很感激的!
我绝不是Javascript方面的专家,但我一直在阅读Mark Pilgrim的“Dive into HTML5”网页,他提到了一些我想更好理解的东西。
他州:
最后,使用双重否定技巧将结果强制为布尔值(true或false)。
function supports_canvas() {
return !!document.createElement('canvas').getContext;
}
如果有人能解释得更好一点,我会很感激的!
在javascript中,如果给定值为true,则使用“bang”操作符(!)将返回true, 1,而不是null等。如果值为undefined、null、0或空字符串,则返回false。
所以bang操作符总是返回一个布尔值,但是它表示的值与你开始时的值相反。如果你将该操作的结果再次“bang”,你可以再次反转它,但仍然会得到一个布尔值(而不是undefined, null等)。
使用bang两次将获得一个可能是未定义的值,null等,并使其为false。它会取一个值,可以是1,“true”,等等,并使它只是纯真。
代码可以这样写:
var context = document.createElement('canvas').getContext;
var contextDoesNotExist = !context;
var contextExists = !contextDoesNotExist;
return contextExists;
逻辑上的NOT运算符!将值转换为与其逻辑值相反的布尔值。
第二个!将先前的布尔结果转换回其原始逻辑值的布尔表示形式。
从这些文档中可以找到逻辑NOT操作符:
如果它的单个操作数可以转换为true则返回false;否则,返回true。
因此,如果getContext给你一个“假”值,!!将使它返回布尔值false。否则返回true。
“伪”值是:
假 南 未定义的 零 ""(空字符串) 0
第一个!将变量强制为布尔类型并将其反转。第二个!再次反转它(为您所检查的任何内容提供原始的(正确的)布尔值)。
为了清晰起见,你最好使用
return Boolean(....);
这与JavaScript的弱类型有关。document.createElement(“画布”)。getContext是一个函数对象。通过预先一个单!它将其作为布尔表达式计算,并将答案翻转。通过预先放置另一个!,它将把答案翻转回来。最终结果是函数将其作为布尔表达式计算,但返回实际的布尔结果,而不是函数对象本身。将! !是将表达式类型转换为布尔类型的一种快速且不方便的方法。
在需要布尔值的上下文中,Javascript有一组让人困惑的规则来判断什么是“真”和“假”。但是逻辑非操作符!总是产生一个合适的布尔值(true和false常量之一)。通过连接其中的两个,成语!!表达式产生一个正确的布尔值,其真实性与原始表达式相同。
你为什么要这么麻烦?因为它让你展示的函数更容易预测。如果它没有双重否定,它可能返回undefined,一个Function对象,或者与Function对象不完全不同的东西。如果这个函数的调用者对返回值做了一些奇怪的事情,那么整个代码可能会行为不当(这里的“奇怪”指的是“除了强制布尔上下文的操作之外的任何操作”)。双重否定成语防止了这种情况。
document.createElement(“画布”)。getContext可以计算为undefined或对象引用。undefined的结果为true, ![some_object]的结果为false。这就是我们需要的,只是倒过来。所以! !用于将undefined转换为false,将对象引用转换为true。
使用! !变量可以保证将类型转换为布尔值。
举个简单的例子:
"" == false (is true)
"" === false (is false)
!!"" == false (is true)
!!"" === false (is true)
但如果你在做以下事情,使用它是没有意义的:
var a = ""; // or a = null; or a = undefined ...
if(!!a){
...
if将它转换为布尔值,因此不需要进行隐式双重否定转换。