javaScript相等运算符==

本文详细解析了ECMAScript规范中对于0==null这一比较表达式的处理过程及返回值,介绍了相等运算符(==)的具体算法步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先来看这个例子,请问下面表达式的值是多少。

    0 == null

如果你不确定答案,或者想知道语言内部怎么处理,就可以去查看规格,7.2.12小节是对相等运算符(==)的描述。

规格对每一种语法行为的描述,都分成两部分:先是总体的行为描述,然后是实现的算法细节。相等运算符的总体描述,只有一句话。

"The comparison x == y, where x and y are values, produces true or false."

上面这句话的意思是,相等运算符用于比较两个值,返回true或false。

下面是算法细节。


       1. ReturnIfAbrupt(x).
       2. ReturnIfAbrupt(y).
       3. If Type(x) is the same as Type(y), then
        Return the result of performing Strict Equality Comparison x === y.
       4. If x is null and y is undefined, return true.
       5. If x is undefined and y is null, return true.
       6. If Type(x) is Number and Type(y) is String,
          return the result of the comparison x == ToNumber(y).
       7. If Type(x) is String and Type(y) is Number,
          return the result of the comparison ToNumber(x) == y.
       8. If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
       9. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
       10. If Type(x) is either String, Number, or Symbol and Type(y) is Object, then
          return the result of the comparison x == ToPrimitive(y).
       11.If Type(x) is Object and Type(y) is either String, Number, or Symbol, then
          return the result of the comparison ToPrimitive(x) == y.
       12. Return false.

上面这段算法,一共有12步,翻译如下。


        1.如果x不是正常值(比如抛出一个错误),中断执行。
        2.如果y不是正常值,中断执行。
        3.如果Type(x)与Type(y)相同,执行严格相等运算x === y。
        4.如果x是null,y是undefined,返回true5.如果x是undefined,y是null,返回true6.如果Type(x)是数值,Type(y)是字符串,返回x == ToNumber(y)的结果。
        7.如果Type(x)是字符串,Type(y)是数值,返回ToNumber(x) == y的结果。
        8.如果Type(x)是布尔值,返回ToNumber(x) == y的结果。
        9.如果Type(y)是布尔值,返回x == ToNumber(y)的结果。
        10.如果Type(x)是字符串或数值或Symbol值,Type(y)是对象,返回x == ToPrimitive(y)的结果。
        11.如果Type(x)是对象,Type(y)是字符串或数值或Symbol值,返回ToPrimitive(x) == y的结果。
        12.返回false

由于0的类型是数值,null的类型是Null(这是规格4.3.13小节的规定,是内部Type运算的结果,跟typeof运算符无关)。因此上面的前11步都得不到结果,要到第12步才能得到false。


0 == null // false

原文出处:阮一峰博客http://www.ruanyifeng.com/blog/2015/11/ecmascript-specification.html

### JavaScript 中 `==` 和 `===` 运算符的区别 在 JavaScript 中,存在两种类型的相等运算符:严格相等 (`===`) 和宽松相等 (`==`)。 #### 严格相等 (`===`) 严格相等比较不仅检查数值是否相同,还会验证数据类型是否一致。只有当两者都匹配时才会返回 `true`[^2]。 ```javascript 1 === 1 // true, 数字等于数字 "hello" === "hello" // true, 字符串等于字符串 null === null // true, 特殊值之间相互比较 undefined === undefined // true, 不同于任何其他类型 0 === -0 // true, 负零被视为正零 [] === [] // false, 即使内容一样也因引用不同而异 var obj1 = {}; var obj2 = obj1; obj1 === obj2 // true, 同一对象实例 ``` #### 宽松相等 (`==`) 相比之下,宽松相等允许跨类型转换后再作对比。这意味着即使两边的数据类型不一样也可能被认为是“相等”的。然而这种行为有时会产生意想不到的结果,并且其内部逻辑较为复杂不易记忆[^1]。 ```javascript '' == '0' // false, 空字符串不会被视作数字字符'0' 0 == '' // true, 零可以隐式转为空字符串 0 == '0' // true, 整数能与表示它的字符串互换 false == 'false'// false, 布尔值不自动映射到特定字符串形式 false == '0' // true, 假布尔可视为整数零 false == undefined // false, 未定义不是假值 false == null // false, 空也不是假值 null == undefined // true, 二者均代表缺失值 '\t\r\n ' == 0 // true, 白空间隔会被解析成数值零 ``` 为了保持代码清晰性和减少潜在错误,建议优先采用严格相等(`===`)来进行条件判断。这有助于避免由于意外类型转换所引起的困惑和问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值