当我尝试警告具有 undefined
值的变量的否定时,我得到的输出为真?
alert(undefined);
alert(!undefined);
第一个警报给出 undefined
,第二个警报给出 true
。
这是预期的行为吗?如果是这样,那为什么?我是否遗漏了一些关于 Javascript 中的 undefined
的概念/理论?
最佳答案
Is this the expected behavior.
是的。
If so then why ?Am I missing some concept/theory about undefined in Javascript?
JavaScript 具有值的隐式转换(又名强制值)的概念。当您使用 negation ("NOT") operator (!
) ,你要否定的东西必须是 bool 值,所以如果它不是 bool 值,它会将它的参数转换为 bool 值。这样做的规则是 defined by the specification : 基本上,如果值为 undefined
、null
、""
、0
、0n
或 NaN
(在浏览器上也是 document.all
¹),它强制转换为 false
;否则,它强制为 true
。
所以 !undefined
是 true
因为 undefined
隐式转换为 false
,然后 !
否定它。
这些值(和 false
)统称为 falsy values .其他任何 1 称为 truthy value .这个概念发挥了很多作用,不仅仅是 !
,还有 if
和循环中的测试以及某些内置函数的回调返回值的处理像 Array.prototype.filter
等
¹ document.all
在浏览器上是假的,即使它是一个对象,并且所有(其他)对象都是真实的。如果您对……有趣的……历史感兴趣,请查看我最近出版的书 JavaScript:新玩具 的第 17 章。基本上,这是为了避免网站不必要地使用非标准、过时的功能。
关于Javascript !undefined 是真的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39075142/