有人可以解释这个“双重否定”的把戏吗?[重复]

2020/10/17 05:01 · javascript ·  · 0评论

我绝不是Javascript的专家,但是我一直在阅读Mark Pilgrim的“ Dive into HTML5”网页,他提到了一些我想更好理解的内容。

他说:

最后,使用双负数技巧将结果强制为布尔值(真或假)。

function supports_canvas() {
  return !!document.createElement('canvas').getContext;
}

如果有人能更好地解释这一点,我将不胜感激!

逻辑NOT运算符!会将值转换为与其逻辑值相反的布尔值。

第二个!将先前的布尔结果转换回其原始逻辑值的布尔表示形式。

从这些逻辑非运算符的文档中:

如果其单个操作数可以转换为true,则返回false;否则,返回false。否则,返回true。

因此,如果getContext给您一个“假”值,!! 它将使它返回布尔值false否则它将返回true

“假”值是:

  • false
  • NaN
  • undefined
  • null
  • "" (空字符串)
  • 0

当放置在需要布尔值的上下文中时,JavaScript对于“ true”和“ false”有一组令人困惑的规则。但是logic-NOT运算符!始终会产生一个适当的布尔值(true和之一false)。通过将它们中的两个链接起来,该成语将!!expression生成一个具有与原始表达式相同的真实性的布尔值。

你为什么要打扰?因为它使您显示的功能更加可预测。如果其中没有双负数,则它可能会返回undefined,一个Function对象或与Function对象完全不同的东西如果此函数的调用者对返回值做一些奇怪的事情,则整个代码可能会行为不当(此处的“奇怪”表示“除了强制布尔上下文的操作外,什么都没有”)。双重否定用法可以防止这种情况。

在javascript中,如果给定值是true,则使用“ bang”运算符(!)将返回true;否则返回1,而不是null。如果该值是undefined,null,0或空字符串,则将返回false。

因此,bang运算符将始终返回布尔值,但它将表示与开始时相反的值。如果采用该操作的结果并再次“敲”它,则可以再次将其反转,但最终仍为布尔值(并且不是undefined,null等)。

两次使用bang将会获得一个可能是未定义,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

!! 返回原始的布尔值(并确保该表达式现在为布尔值,而不管以前是什么)

第一个!将变量强制为布尔类型并将其求反。第二个!再次将其反转(为您要检查的内容提供原始的(正确的)布尔值)。

为了清楚起见,您最好使用

return Boolean(....);

document.createElement('canvas').getContext可以评估为undefined或对象引用。!undefined产量true![some_object]产量false这几乎是我们需要的,只是倒过来了。因此!!用于转换undefinedfalse和的对象引用true

这与JavaScript的弱类型有关。 document.createElement('canvas').getContext是一个功能对象。通过在单个前缀之前将!其评估为布尔表达式,然后翻转答案。通过添加另一个!,它将答案反过来。最终结果是该函数将其评估为布尔表达式,但返回实际的布尔结果,而不是函数对象本身。前置!!是将表达式类型转换为布尔类型的一种快速而肮脏的方法。

如果document.createElement('canvas').getContext不是undefined或者null,它会返回true否则它将返回false

本文地址:http://javascript.askforanswer.com/yourenkeyijieshizhegeshuangzhongfoudingdebaximazhongfu.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!