当我尝试警告对具有 undefined
值的变量的否定时,我得到的输出是真的吗?
alert(undefined);
alert(!undefined);
第一个警报给出 undefined
,第二个警报给出 true
。这是预期的行为吗?如果是这样,那为什么?我是否在 Javascript 中遗漏了一些关于 undefined
的概念/理论?
原文由 Manas Saxena 发布,翻译遵循 CC BY-SA 4.0 许可协议
当我尝试警告对具有 undefined
值的变量的否定时,我得到的输出是真的吗?
alert(undefined);
alert(!undefined);
第一个警报给出 undefined
,第二个警报给出 true
。这是预期的行为吗?如果是这样,那为什么?我是否在 Javascript 中遗漏了一些关于 undefined
的概念/理论?
原文由 Manas Saxena 发布,翻译遵循 CC BY-SA 4.0 许可协议
13 回答13k 阅读
7 回答2.2k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
6 回答1.1k 阅读
是的。
JavaScript 具有值的 _隐式转换_(又名 _强制值_)的概念。当您使用 否定(“NOT”)运算符(
!
) 时,您要否定的东西必须是布尔值,因此如果它的参数不是布尔值,它会将其转换为布尔值。 The rules for doing that are defined by the specification : Basically, if the value isundefined
,null
,""
,0
,0n
, orNaN
(alsodocument.all
on browsers¹), it coerces tofalse
;否则,它会强制转换为true
。So
!undefined
istrue
becauseundefined
implicitly converts tofalse
, and then!
negates it.这些值(和
false
)统称为 虚假 值。其他任何 1 都称为 真 值。这个概念发挥了很多作用,不仅在!
中,而且在if
中的测试和循环以及某些内置函数的回调返回值的处理,如Array.prototype.filter
等¹
document.all
在浏览器上是虚假的,即使它是一个对象,并且所有(其他)对象都是真实的。如果您对……有趣的……历史感兴趣,请查看我最近出版的《JavaScript:新玩具》一书的第 17 章。基本上,这是为了避免网站不必要地使用非标准、过时的功能。