Javascript 虚假值(null、undefined、false、空字符串 : "" or '' and 0) and comparison(==) operator

标签 javascript null undefined

这个问题在这里已经有了答案:





JavaScript: What is the difference between `if (!x)` and `if (x == null)`?

(6 个回答)


8年前关闭。




当我在 null 中使用任何值( undefinedfalse''0if )时陈述,它总是被评估为谬误(false)。此外,null 语句中这些值的否定(( undefinedfalse''0if )总是被评估为重言式( true )。

 if(null){
 }else{
 }

 if(undefined){
 }else{
 }

 if(false){
 }else{
 }

 if(''){
 }else{
 }

 if(0){
 }else{
 }

在上述所有情况下,if语句被评估为 false & else语句执行。
但是,当我将这些谬误值与 == 进行比较时运算符,它不返回 true总是。令人惊讶的是,它总是返回 true当我比较这些值的否定时的值。

如果 double equalto ( == ) 运算符检查/比较值而不是严格地检查类型,那么为什么:
null == false          // returns false

null == 0              // returns false

null == ''             // returns false

但,
!null == !false       // returns true

!null == !0           // returns true

!false == !undefined  // returns true

和,
null == undefined     // returns true

false == 0            // returns true

如果有人能澄清这些值之间的行为或关系,我将不胜感激(nullundefinedfalse''0)。

最佳答案

一个常见的误解

"...If double equalto (==) operator only checks/compares for values & not for types..."



这是一个不正确的假设,尽管人们经常重复它。实际上,==确实检查类型,实际上比 === 更关注类型比较确实。

Abstract Equality Comparison Algorithm .

一个 ==比较不会进行简单的 toBoolean 转换。相反,它会通过一个有点复杂的递归算法,在检查类型之后,如果它们不匹配,它会尝试将操作数强制为相同的类型。

它执行的类型强制非常特定于操作数的类型。对于不同的类型对,可以发生不同的强制序列。通常(但不总是)它最终最终将操作数强制为 number类型。

为什么!改变操作数

当您使用 ! 手动强制两个操作数时,您现在正在执行一个简单的 toBoolean 转换,导致类型匹配,这避免了算法的类型强制部分,使其行为本质上类似于 Strict Equality Comparison Algorithm .

因此,预测 == 的结果的唯一方法是类型不匹配时的比较是为了理解抽象算法。

不要忘记 NaN
仅供引用,还有一个“虚假”值需要考虑,NaN .其==比较将始终为 false ,无论如何。即使与另一个 NaN 进行比较值,它将是 false .

关于Javascript 虚假值(null、undefined、false、空字符串 : "" or '' and 0) and comparison(==) operator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21206207/

相关文章:

javascript - Cakephp 2.X 具有内联按钮

javascript - 代码未打印到屏幕

mysql - 嵌套选择 选择

javascript - 原型(prototype)查找元素并仅在找到时执行

javascript - Uncaught SyntaxError : Missing ) after argument list, but no extra }'s? [closed]

javascript - 在 Cucumber.js 中是否可以列出所有可用的步骤?

javascript - RapidAPI 响应体显示为 "undefined"

PHP MySQL - 编辑数据中 undefined index

MySQL:检测文本 "NULL"或 0 字段并将其更改为正确的 NULL

java - 为什么我的 Spring @Autowired 字段为空?