Javascript中!undefined是否会返回true?

18

当我尝试警告一个变量否定,而该变量具有 undefined 值时,输出结果为 true?

alert(undefined);
alert(!undefined);

第一个警告给出了undefined,第二个警告给出了true。这是预期的行为吗?如果是,那么为什么?我是否缺少对JavaScript中undefined的某些概念/理论的了解?


4
布尔非。反转值,“undefined”是假值,因此!undefined将返回“真”。 - Tushar
1
你希望得到什么样的结果呢? - deceze
这个链接可能会有所帮助:http://james.padolsey.com/javascript/truthy-falsey/ - Suraj Jadhav
1
从概念上讲,只有两种可能性:当您尝试将非布尔值视为布尔值时,JavaScript 会抛出错误(!undefinederror, use of non-boolean value in boolean context);或者该值将被强制转换为布尔值,在这种情况下,undefined == false 就有很多意义了。 - deceze
你只是没有仔细思考。假设变量x意外地未定义。然后我编写一个if语句来检查x是否未定义。如果(!x)执行某些操作。!x返回true,因此我的if语句认为它是未定义的。 - sammy
4个回答

41

这是预期的行为吗?

是的。

如果是这样,那么为什么?我是否缺少关于JavaScript中未定义概念/理论的一些知识?

JavaScript有值的隐式转换(也称强制类型转换)的概念。当使用否定运算符(“NOT”操作符!时,你所否定的东西必须是布尔值,因此如果它不是布尔值,则将其参数转换为布尔值。这些规则由规范定义:基本上,如果该值为undefinednull""00nNaN(还有浏览器¹中的document.all),则它会被转换为false;否则,它将被转换为true

!undefined的值为true,因为undefined会隐式转换为false,然后!将其取反。这些值(以及false)统称为假值。其他任何值¹都被称为真值。这个概念经常用于!if语句和循环的测试以及处理回调函数的返回值,例如Array.prototype.filter等内置函数。

¹ 在浏览器中,document.all 是假值,尽管它是一个对象,而所有(其他)对象都是真值。如果您对其背后的有趣历史感兴趣,请查看我最近一本书的第17章JavaScript: The New Toys。基本上,这是为了避免网站不必要地使用非标准、过时的功能。


很好的解释! - coderpc

3

是的,这是预期行为。

在JavaScript中,以下值的否定将返回true:

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

例如:!undefined = true

注意:当您使用==与false进行比较时,以下检查将返回true,但它们的否定将返回false。

  • " "(仅空格)。
  • [](空数组),

例如:[] == false 会返回true,但![ ]会返回false


1
空数组和仅包含空格的字符串不是“假值”。 - deceze
[ ] == false 在控制台中会返回 true,我刚刚检查过了,同样的测试也适用于空格。 - Samu
在你检查的时候,也请注意 ![]!" " - deceze
2
@Samu:关于 [] == false,这是因为抽象相等比较算法的第七步。你最终会将 00 进行比较。 - T.J. Crowder
是的,刚刚检查了一下,你是对的。"" == false 会得到 true,但 !" " 会得到 false。 - Samu
显示剩余2条评论


0
如果你需要严格的检查,你应该避免使用非严格运算符:
$ node -p 'undefined == null'
true

并使用严格的运算符:

$ node -p 'undefined === null'
false

很不幸,严格的否定不存在。

但是您可以对所有内容进行两次否定,以获得真正的布尔等价物:

$ node -p '!!undefined'
false

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