JavaScript中变量前的感叹号代表什么意思?

26

我正在通过查看应用程序中的一些代码来学习 JavaScript,而且我经常在 if 条件语句中看到 !variable。例如:

if (!variable.onsubmit || (variable.onsubmit() != false)) {

这是什么?一种测试变量是否为空的方法吗?


2
只是一点提示:如果你在搜索引擎上搜索一个运算符,请使用它的全名(例如,如果你想搜索 ! 的含义,就要搜索 "感叹号 javascript")。 - Qantas 94 Heavy
7
关闭这个问题的人认为这是“基础理解不足”,你怎么看?当Winters接触这个问题时,你对他之前的JavaScript知识有何期望?这是绝对基础的。仅仅因为一个问题看起来很容易并不意味着它是一个不好的问题。这个问题具有广泛的适用性。如果有人想添加任何内容,请编辑我的答案(它是社区Wiki)。 - Benjamin Gruenbaum
感谢@Qantas94Heavy提供的搜索提示。我只是想补充一下,我确实搜索了很多次,但是像w3schools示例中的!(x==y)那样的争论让我有些困惑。 - Winters
2
@Winters 一般来说,W3schools不是一个非常可靠的来源(http://www.w3fools.com)。如果可以的话,最好使用MDN或Stack Overflow(当然规范始终是最好的,但像Qantas94Heavy提到的那样,一开始阅读起来也很困难)。 - Benjamin Gruenbaum
4个回答

57

!是JavaScript中的逻辑非操作符

正式

!expression读作:

  • 取出expression并对其进行求值。在您的情况下,这是variable.onsubmit
  • 将该求值结果转换为布尔值。在您的情况下,由于onsubmit可能是一个函数,因此意味着-如果函数为null或undefined-返回false,否则返回true。
  • 如果该求值结果为true,则返回false。否则返回true。

在您的情况下

在您的情况下,!variable.onsubmit表示如果没有定义函数(因此为假),则返回true,否则返回false(因为已定义函数)。

简单来说- !variable表示取出variable的真值并对其取反。

因此,if (!variable) {将进入if子句,如果变量是false(或强制转换为false)

总计

if (!variable.onsubmit || (variable.onsubmit() != false)) {

意思是 - 检查 variable.onsubmit 是否已定义并为真(因此为 true),然后检查调用 onsubmit 是否返回一个强制转换为 true 的结果。简而言之,它检查是否没有 onsubmit 或它返回 true。

下一次,我该如何自己找到这个信息?


好的,我现在有点明白了,但是为什么OR的第二部分要检查variable.onsubmit() != false呢?为什么不检查variable.onsubmit() = true呢? - Winters
@Winters 或者只是 variable.onsubmit()。没有理由这么做。没有办法说得好 - 这个语句的第二部分只是编码不良。 - Benjamin Gruenbaum
根据这段代码的其余部分,我并不感到惊讶,谢谢。 - Winters

7
它是一个否定运算符,用于检查变量的真假。
var myVariable = 1;

if ( ! myVariable )
{
    // myVariable evaluates as false
}

if ( myVariable )
{
    // myVariable evaluates as true
}

2
所选答案已经回答了问题。需要补充的是,!操作符可以以相当有趣的方式使用。
obj = {}
if (!!obj) {console.log('works')} // !!obj = true
obj = undefined
if (!!obj) {console.log('does not work')} // !!obj = false

因此,双重 !! 将任何表达式更改为布尔值,没有例外。

这在某些情况下具有非常特殊的用途。

  • 假设有一个函数只返回 true 或 false,没有其他返回值。在这种情况下,可以将 return returnValue 更改为 return !!returnValue ,以增加谨慎(尽管在大多数情况下不需要)。

  • 相反,如果函数只接受 true 或 false,没有其他参数,那么可以调用函数时使用 functionA(!!parameter) 而不是 functionA(parameter),这也在大多数情况下不需要,但可以确保额外的安全性。


0

! 是一个逻辑反转运算符,如果某个条件为真,则将其变为假;如果某个条件为假,则将其变为真。

例如,我们知道在布尔值中,空字符串或 0 表示假。

let a = Boolean("")
console.log(a) // shows false, because empty string in boolean is false
console.log(!a) // shows true, because logic is reversed

更简单的例子:
let a = 5
let b = 1
let c = a > b
console.log(c) // shows true, since a,5 is bigger than b,1
console.log(!c) // shows false, since logic is now reversed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接