将这两个内容放在一起,是因为操作符在执行过程中会有很多的隐式类型转换出现。
ECMAScript 提供两组操作符:相等(==) 和 全等(===)
相等操作符和不相等操作符都会先 转换操作数,然后再比较他们的相等性。在转换时,遵循下列基本规则:
- 如果有一个操作数是 布尔值,在比较前将其转换为数值
- 如果一个操作数是字符串,另一个操作数是数值,则将字符串转换为数值
- 如果一个操作数是对象,另一个不是,则调用对象的
valueOf()
方法,用得到的基本类型值按照前面的规则比较 - null 和 undefined 是相等的
- 在比较相等性之前,不能将 null 和 undefined 转换为其他任何值
- 如果有一个操作符是 NaN,则相等操作符返回 false,不相等操作符返回 true;即使两个操作数都是 NaN,也一样
- 如果两个操作数都是对象,则比较它们是否指向同一个对象
比较前不转换操作数,其余和相等没有差别
关系操作符包括小于(<),大于(>),小于等于(<=),大于等于(>=)。当关系操作符的操作数使用的非数值时,也要进行数据转换。
- 如果两个操作数都是数值,则进行数值比较
- 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值
- 如果一个操作数是数值,将另一个操作数转换为一个数值,进行数值比较
- 如果一个操作数是对象,则调用这个对象的
valueOf()
方法,用得到的结果按前面的规则比较。如果对象没有valueOf()
方法,调用toString()
方法,并用得到的结果根据前面的规则比较 - 如果一个操作数是布尔值,将其转换为数值
乘除操作符(*)和(/),计算时会用Number()
转型函数将非数值的操作数转换为数值
- 数字 + 对象, 优先调用对象的
valueOf()
,再调用toString()
- 数字 + boolean/null = 数字
- 数字 + undefined == NaN
- 字符串 + (任何)== 转为字符串后拼接
var obj1 = {
a:1,
b:2,
toString:function(){
return "this is a toString function";
},
valueOf:function(){
return "this is a valueOf function";
}
};
console.log(1+obj1); //1this is a valueOf function
console.log(1+obj1.valueOf()); //1this is a valueOf function
console.log(1+obj1.toString()); //1this is a toString function
第一个操作数 | 第二个操作数 | 返回值 |
---|---|---|
对象 | / | 第二个操作数 |
对象 | 对象 | 第二个操作数 |
/ | 对象 | 第一个操作数求值为 true 时返回第二个操作数 |
null | null | null |
NaN | NaN | NaN |
undefined | undefined | undefined |
第一个操作数 | 第二个操作数 | 返回值 |
---|---|---|
对象 | / | 第一个操作数 |
对象 | 对象 | 第一个操作数 |
/ | 对象 | 第一个操作数求值为 false 时返回第二个操作数 |
null | null | null |
NaN | NaN | NaN |
undefined | undefined | undefined |
转换规则:
数据类型 | 转换为 true 的值 | 转换为 false 的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | "" |
Number | 任何非零数字值 | 0 |
Object | 任何对象 | null |
Undefined | / | undefined |
转换规则:
- Boolean 值:转换为 0 和 1
- 数字值:简单地传入和返回
- null:返回 0
- undefined:返回 NaN
- 字符串:遵循以下规则
- 如果字符串中只包含数字(包括符号),转换为十进制数值(会忽略前导 0)
- 如果字符串包括有效的浮点格式,如 "1.1",则将其转换为对应的浮点数值(忽略前导 0)
- 如果字符串包含有效的十六进制格式,如 "0xf",则将其转换为大小相同的十进制整数
- 如果字符串为空,转换为 0
- 如果字符串包含上述格式外的字符,将其转换为 NaN
- 对象:调用对象的
valueOf()
方法,然后按前面的规则转换;如果转换结果为 NaN,再调用对象的toString()
方法,然后按前面的规则转换