有人能解释这个“双重否定”的把戏吗?

2022-08-30 01:11:41

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

他说:

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

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

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


答案 1

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

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

从以下 Docs 中,逻辑 NOT 运算符:

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

因此,如果给你一个“falsey”值,将使其返回布尔值。否则它将返回 。getContext!!falsetrue

“falsey”值为:

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

答案 2

Javascript有一套令人困惑的规则,当放置在期望布尔值的上下文中时,什么被认为是“真”和“假”。但是逻辑 NOT 运算符 , 总是生成一个正确的布尔值(常量和 之一)。通过链接其中两个,成语产生了一个与原始表达具有相同真实性的正确布尔值。!truefalse!!expression

你为什么要打扰?因为它使像您显示的函数一样的函数更可预测。如果它没有双负值,它可能会返回,一个对象,或者与对象不完全不同的东西。如果此函数的调用方对返回值执行了一些奇怪的操作,则整个代码可能会行为不端(此处的“奇怪”表示“除强制实施布尔上下文的操作之外的任何内容”)。双阴性成语可以防止这种情况。undefinedFunctionFunction