当前位置: 首页 > 知识库问答 >
问题:

为什么在if语句中使用双感叹号?

融伯寅
2023-03-14

我最近阅读了一些使用!!将变量转换为布尔值以在if语句中进行评估的代码。这对我来说似乎有些多余,因为无论如何都会评估变量的布尔值。这样做有什么性能优势吗?还是为了更好地支持浏览器?

示例代码:

var x = 0;
var atTop = x===window.scrollY;
if(!!atTop){
   alert("At the top of the page.");
}

编辑:

我也在非布尔类型的操作数中看到了这一点,但我一直假设使用if无论如何都会评估变量的布尔值,因为Javascript中的所有值都是“真实的”或“Falsey”。

示例代码:

var x = 1;//or any other value including null, undefined, some string, etc
if(!!x){//x is "truthy"
   //wouldn't using if(x) be the same???
   console.log("something...");
}

共有3个答案

华凡
2023-03-14

在if语句中这样做没有任何运行时益处(或客观益处)。if语句执行的求值将产生与双感叹号生成的求值完全相同的结果。没有区别。

双感叹号是确保布尔值基于真实性的有用表达式。例如,考虑:

var text = undefined;
console.log(text); // undefined
console.log(!!text); // false

// It would make sense here, because a boolean value is expected.
var isTextDefined = !!text;

// It would also affect serialization
JSON.stringify(text); // undefined (non-string)
JSON.stringify(!!text); // "false"

我认为这是由于上述用例而养成的习惯,因此当希望解决变量的真实性时,总是转换为布尔值。当规则总是被应用时,我们(人类和程序员)更容易遵循规则。你要么一直使用车里的闪光灯,即使周围没有人,要么偶尔(或经常)忘记在应该的时候发出信号。

郜俊晤
2023-03-14
匿名用户

我想说这主要是为了代码易读性。我怀疑这是否有任何重要的性能或兼容性影响(请随时测试)

但是在代码易读性方面,这对我来说意味着这个变量以前不是布尔值,但是我们想把它作为一个变量来评估,如果你添加了关于这个变量的新逻辑,请记住这一点。

虽然在你的例子中它已经是布尔型的,所以它是100%冗余的,但我想这只是一些人的一个习惯,因为上面的推理过度应用了,和/或在别处看到它,并在没有完全理解它的情况下复制该模式(短篇故事时间:在C语言中,您可以通过添加变量名来命名受保护项,所以var@class=“hello”;,初级开发人员只是假设所有需要的变量名都在前面,并按这种方式编码。我想知道是否有人认为没有比较运算符的if需要有 在其前面作为比较运算符)

帅博简
2023-03-14

简短的回答:不,没有理由。

在您的代码中,它已经是一个布尔类型,不需要转换它,再转换回来,您将始终得到相同的结果。实际上,如果您有任何布尔值(true或false),当您使用时 使用其中任何一个,它将转换回其初始值:

console.log(!!true); // Will be always "true"
console.log(typeof !!true); // It stills a "boolean" type
console.log(!!false); // Will be always "false"
console.log(typeof !!false); // It stills a "boolean" type

 类似资料:
  • 从…起https://source.dot.net/#System.Private.CoreLib/Hashtable.cs,475: 它看起来像两个零原谅运算符。有相关文件吗?

  • 问题内容: Swift编程语言指南包含以下示例: 然后,在将公寓分配给该人时,他们使用感叹号“解开实例”: “取消实例包装”是什么意思?为什么有必要?它与仅执行以下操作有何不同: 我是Swift语言的新手。只是想降低基础知识。 更新: 我遗漏的一大难题(未在答案中直接说明-至少在撰写本文时没有)是在执行以下操作时: 正如我最初所认为的,这并不意味着“ 是类型,可能为零”。我只是误解了,它们是完全独

  • 行动时刻 - 在unlang中使用if语句 if语句本身并不复杂。 它具有以下格式: if(condition){ ... } 由于其许多可能性,条件部分可能变得复杂。 使用if语句获取返回码 我们现在将查看模块的返回代码,并使用此代码与指定的条件进行比较。 FreeRADIUS中的每个模块都需要在调用时返回代码。 随后可以将此代码的值用作if语句中的条件检查。 使用if语句授权用户 如

  • 问题内容: 以下Java代码无法编译。 为什么?在没有先声明的情况下,没有代码路径可导致程序将1分配给该路径。 我想到的范围可能仅限于第一条陈述,但后来我不明白为什么。如果我真的不想不必要地声明以提高性能怎么办?我不喜欢声明后不使用变量。 (您可能想争论一下,我不可以在第二条语句中简单地声明b ,在这种情况下,请想象一下它可能在其他地方处于循环中。) 问题答案: 为什么?如果没有先声明,没有代码路

  • 问题内容: 在C语言中,我可以编写一个if语句 但是,当我尝试在Java中执行相同操作时,编译器会告诉我“不兼容的类型”,并说我需要一个而不是一个。有什么方法可以用Java编写C代码吗? 问题答案: 以下任何一项都可以为您工作:

  • 问题内容: 您可以像这样在JSX中使用if语句吗? 像上面的东西?是否可以根据条件使用JSX? 问题答案: 使用条件渲染,并且由于没有其他情况,因此为了简洁起见,可以使用而不是三元运算符: 之所以起作用,是因为在JavaScript中,总会求和,并且总会求和。 因此,如果条件为true,则&&之后的元素将出现在输出中。如果为假,React将忽略并跳过它。 从而: 仅当条件为true时才渲染JSX。