3.5.7 关系操作符
关系操作符执行比较两个值的操作,
包括小于( < )、大于( > )、小于等于( <= )和大于等于( >= )。
在将它们应用到不同数据类型时也会发生类型转换和其他行为:
- 如果操作数都是数值,则执行数值比较。
- 如果操作数都是字符串,则逐个比较字符串中对应字符的编码。
- 如果有任一操作数是数值,则将另一个操作数转换为数值,执行数值比较。
- 如果有任一操作数是对象,则调用其 valueOf() 方法,取得结果后再根据前面的规则执行比较。
如果没有 valueOf() 操作符,则调用 toString() 方法,取得结果后再根据前面的规则执行比较。 - 如果有任一操作数是布尔值,则将其转换为数值再执行比较。
3.5.8 相等操作符
ECMAScript提供了两组操作符:
- 第一组是等于和不等于,它们在比较之前执行转换。
- 第二组是全等和不全等,它们在比较之前不执行转换。
-
等于和不等于( == )
如果操作数相等,则会返回 true 。
不等于操作符用叹号和等于号( != )表示,如果两个操作数不相等,则会返回 true 。
这两个操作符都会先进行类型转换(通常称为强制类型转换)再确定操作数是否相等。在转换操作数的类型时,相等和不相等操作符遵循如下规则:
- 如果任一操作数是布尔值,则将其转换为数值再比较是否相等。 false 转换为 0, true 转换
为 1。 - 如果一个操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否
相等。 - 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf() 方法取得其原始值,再
根据前面的规则进行比较。
在进行比较时,这两个操作符会遵循如下规则:
- null 和 undefined 相等。
- null 和 undefined 不能转换为其他类型的值再进行比较。
- 如果有任一操作数是 NaN ,则相等操作符返回 false ,不相等操作符返回 true 。记住:即使两个操作数都是 NaN ,相等操作符也返回 false ,因为按照规则, NaN 不等于 NaN 。
- 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true 。否则,两者不相等。
下表总结了一些特殊情况及比较的结果:
null == undefined // true "NaN" == NaN // false 5 == NaN // false NaN == NaN // false NaN != NaN // true false == 0 // true true == 1 // true true == 2 // false undefined == 0 // false null == 0 // false "5" == 5 // true
- 如果任一操作数是布尔值,则将其转换为数值再比较是否相等。 false 转换为 0, true 转换
-
全等和不全等
-
全等操作符( === )
只有两个操作数在不转换的前提下相等才返回 true。
let result1 = ("55" == 55); // true,转换后相等 let result2 = ("55" === 55); // false,不相等,因为数据类型不同
-
-
不全等操作符( !== )
只有两个操作数在不转换的前提下不相等才返回 true 。
let result1 = ("55" != 55); // false,转换后相等 let result2 = ("55" !== 55); // true,不相等,因为数据类型不同
虽然 null == undefined 是 true (因为这两个值类似),但 null === undefined 是false ,因为它们不是相同的数据类型。
网友评论