有人可以解释这种“双重否定”的伎俩吗?

这个问题在这里已经有了答案:

  • 是什么 !! (不)没有运算符在JavaScript中? 31个答案

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

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

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

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

    所以如果getContext给你一个“假”的价值, !! 将使它返回布尔值false 。 否则它将返回true

    “虚假”的价值是:

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

  • 如果将Javascript置于预期布尔值的上下文中,那么对于被视为“真”和“假”的规则,Javascript会有一系列混乱的规则。 但逻辑NOT运算符! ,总是产生一个合适的布尔值(其中一个常量truefalse )。 通过链接它们中的两个,成语!!expression产生与原始表达式具有相同真实性的适当的布尔值。

    你为什么打扰? 因为它使得你的功能更具可预测性。 如果它没有双重否定,它可能会返回undefined ,一个Function对象,或者与Function对象完全不同的东西。 如果这个函数的调用者用返回值做了一些奇怪的事情,那么整体代码可能会行为不端(这里的“怪异”意思是“除了强制布尔上下文的操作之外的任何事情”)。 双重否定的习语可以防止这种情况发生。


    在JavaScript中,如果给定值为真,则使用“bang”运算符(!)将返回true,如果值为undefined,null,0或空字符串,则它将返回false。

    所以bang运算符总是会返回一个布尔值,但它会代表你开始的相反值。 如果你采取了该操作的结果并再次“敲打”它,你可以再次反转它,但仍然以boolean结束(而不是未定义的,null等)。

    使用bang两次将会得到一个可能未定义的值,null等,并且只是简单的false 。 它将采取可能是1的值,“真”等,使它只是普通的true

    代码可以写成:

    var context = document.createElement('canvas').getContext;
    var contextDoesNotExist = !context;
    var contextExists = !contextDoesNotExist;
    return contextExists;
    
    链接地址: http://www.djcxy.com/p/12637.html

    上一篇: Can someone explain this 'double negative' trick?

    下一篇: Scala and the :: object