如果两个操作类型相同,则和上文相等运算符的比较规则一样。如果严格相等,那么比较结果相等。如果他们不严格相等,则比较结果不相等。
如果两个操作类型不同,“==”相等操作符也会认为它们相等。检测相等会遵循如下的规则和类型转换:
如果一个类型是null,令一个是undefined,则它们相等
如果一个值是数字,另一个是字符串,先将字符串转换为数字,然后使用转换后的值进行比较。
如果一个值是true,则将其转换为1再进行比较,如果一个值是false,则转换为0比较。
如果一个值是对象,另一个值是数字或字符串,则使用3章8节3小节的方法的转换规则将对象转换为原始值,然后进行比较。对象通过toString()方法或者valueOf()方法转换为原始值。javascript语言核心的内置类首先尝试使用valueOf()再尝试使用toString(),除了日期类,日期类只能通过toString()转换。那些不是javascript 语言核心中的对象则通过实现中定义的方法转换为原始值。
其它不同类型之间的比较均不相等
这里有一个判断相等的小例子
"1" == true
这个表达式的结果为true,这表明完全不同类型的值比较结果为相等。布尔值true首先转换为数字1 ,然后再执行比较。接下来字符串“1”也会转换为数字1 ,因为两个数字的值相等,因此结果为true.
ii.比较运算符
小于(<)
如果第一个操作数小于第二个操作数,则“<”运算结果我true,否则为false
小于等于(<=)
大于(>)
大于等于(>=)
....(不详细介绍含义)
比较操作符的操作数可能是任意类型。然而只有数字和字符串才能真正执行比较操作符,因此,那些不是数字和字符串的操作数都将进行类型转换。类型转换规则如下:
如果操作数为对象,则按照3章8节3小节处锁描述的转换规则转换为原始值:如果valueOf()返回一个原始值,那么直接使用这个原始值。否则使用toString() 的转换结果进行比较。
在对转换为原始值之后,如果两个操作数都是字符串,那么将依字母表的顺序对两个字符串进行比较,这里提到的“字母表顺序”是组成这两个字符串的16位Unicode字符的索引顺序。
在对象转换为原始值之后,如果至少一个操作数不去是字符串,那么两个操作数都将为数字进行数值的比较。0和-0是相等的。Infinty壁其它任何数字都大(除了infinty本身),-infinty比任何数字都小(除了它自己本身。)如果一个操作数(或转换后)为NaN,那么比较符总是返回false
对于数字和字符串操作符来说,加号运算符和比较运算符的行为有所不同 ,前者更偏爱字符串,如果它的其中一个操作数是字符串的话,则进行字符串连接操作。而比较运算符则更偏爱数字,只有在两个操作数都是字符串串的时候。才会进行字符串的比较。
复制代码 代码如下:
1 + 2 //=>3 加法,结果为3
"1" + "2" //字符串连接,结果为"12"
"1" + 2 //字符串连接,2转换为"2",结果"12"
11 < 3 //数字比较,结果true
"11" < "3" //字符串比较,结果为true
"11" < 3 //数字的比较,“11”转换为11,结果为true
"one" < 3 //数字比较,"one"转换为NaN,结果为falase