当我尝试警告一个变量否定,而该变量具有 undefined
值时,输出结果为 true?
alert(undefined);
alert(!undefined);
第一个警告给出了undefined
,第二个警告给出了true
。这是预期的行为吗?如果是,那么为什么?我是否缺少对JavaScript中undefined
的某些概念/理论的了解?
当我尝试警告一个变量否定,而该变量具有 undefined
值时,输出结果为 true?
alert(undefined);
alert(!undefined);
第一个警告给出了undefined
,第二个警告给出了true
。这是预期的行为吗?如果是,那么为什么?我是否缺少对JavaScript中undefined
的某些概念/理论的了解?
这是预期的行为吗?
是的。
如果是这样,那么为什么?我是否缺少关于JavaScript中未定义概念/理论的一些知识?
JavaScript有值的隐式转换(也称强制类型转换)的概念。当使用否定运算符(“NOT”操作符!
)时,你所否定的东西必须是布尔值,因此如果它不是布尔值,则将其参数转换为布尔值。这些规则由规范定义:基本上,如果该值为undefined
、null
、""
、0
、0n
或NaN
(还有浏览器¹中的document.all
),则它会被转换为false
;否则,它将被转换为true
。
!undefined
的值为true
,因为undefined
会隐式转换为false
,然后!
将其取反。这些值(以及false
)统称为假值。其他任何值¹都被称为真值。这个概念经常用于!
、if
语句和循环的测试以及处理回调函数的返回值,例如Array.prototype.filter
等内置函数。
¹ 在浏览器中,document.all
是假值,尽管它是一个对象,而所有(其他)对象都是真值。如果您对其背后的有趣历史感兴趣,请查看我最近一本书的第17章JavaScript: The New Toys。基本上,这是为了避免网站不必要地使用非标准、过时的功能。
是的,这是预期行为。
在JavaScript中,以下值的否定将返回true:
例如:!undefined = true
注意:当您使用==与false进行比较时,以下检查将返回true,但它们的否定将返回false。
例如:[] == false 会返回true,但![ ]会返回false
![]
和 !" "
。 - deceze$ node -p 'undefined == null'
true
并使用严格的运算符:
$ node -p 'undefined === null'
false
很不幸,严格的否定不存在。
但是您可以对所有内容进行两次否定,以获得真正的布尔等价物:
$ node -p '!!undefined'
false
!undefined
将返回“真”。 - Tushar!undefined
→ error, use of non-boolean value in boolean context);或者该值将被强制转换为布尔值,在这种情况下,undefined == false
就有很多意义了。 - deceze