1. 相等运算符(==)
- 当两侧是原始类型的值
当两侧类型不同时,默认转为Number类型
true == 1 // => true
true == "1" // => true
1 == "1" // => true
- 当至少一侧是对象是
将对象转为原始类型(只要是原始类型就行,不需要到具体的类型)。转换规则如下
1. 当是非Date类型的对象时,默认先调用ValueOf方法,如果返回原始值,转换结束;否则继续调用toString()方法,直到返回原始类型的值。
var obj1 = {
valueOf: function() {
return "4"
},
toString: function() {
return 5
}
}
var obj2 = {
valueOf: function() {
return {}
},
toString: function() {
return 5
}
}
5 == obj1 // => false
4 == obj1 // => true; 相当于4 == "4"
5 == obj2 // => true
2. 当对象是Date类型时,默认先调用toString()方法。与其他对象类型相反。
var date = new Date(2000,1,1);
// date.toString() => "Tue Feb 01 2000 00:00:00 GMT+0800 (中国标准时间)"
// date.ValueOf() => 949334400000
date == 949334400000 // false
date == "Tue Feb 01 2000 00:00:00 GMT+0800 (中国标准时间)" // true
2. 加法运算符(+)
说明:当+作为一元运算符时,相当于调用Number()类型转换方法
- 当两侧是原始类型时
1. 如果其中一侧是字符串,则另一侧默认转为字符串
"1" + true // => 1true
"1" + 1 // => 11
2. 如果两侧都没有字符串类型,则全部转为数字类型
1 + true // => 2
true + true // => 2
注意: null 转为数字 => 0 undefined转为数字 => NaN
2 + null // => 2
2 + undefined // => NaN
- 当至少一侧是对象类型时
转换规则和(==)完全相同
// 1\. 普通对象
var obj1 = {
valueOf: function() {
return "4"
},
toString: function() {
return 5
}
}
var obj2 = {
valueOf: function() {
return {}
},
toString: function() {
return 5
}
}
1 + obj1 // => "14"
1 + obj2 // => 6
// 2\. 当对象为Date类型时
var date = new Date(2000,1,1);
// date.toString() => "Tue Feb 01 2000 00:00:00 GMT+0800 (中国标准时间)"
// date.ValueOf() => 949334400000
1 + date // => "1Tue Feb 01 2000 00:00:00 GMT+0800 (中国标准时间)"
3. 比较运算符 (> < <= >= !=)
- 当两侧都是原始类型的值
1. 两侧都是数值或者字符串,按照自然规律比较
"2" > "11" // => true
2 > 11 // => false
2. 当两侧不同于上面的情况,转为数值类型进行比较
2 > "11" // => false
true > false // => true
true > "false" // => false; "false"转为NaN
- 当至少一侧是对象时
将对象类型转为原始类型
不同于+/==, 比较运算符中Date对象和普通对象的表现一致。即所有的对象全部默认先调用ValueOf方法,如果不能转为原始类型,再调用toString() 类型
// 1\. 普通对象
var obj1 = {
valueOf: function() {
return "4"
},
toString: function() {
return 5
}
}
var obj2 = {
valueOf: function() {
return {}
},
toString: function() {
return 5
}
}
13 > obj1 // => true; 相当于13 > "4", 即13 > 4
4 > obj2 // => false
// 2\. 当对象为Date类型时
var date = new Date(2000,1,1);
// date.toString() => "Tue Feb 01 2000 00:00:00 GMT+0800 (中国标准时间)"
// date.ValueOf() => 949334400000
date > date - 1 // true; 转number类型
4. 其他算法运算符(- * /等)
不同于上面的三类运算符只是将对象转为原始类型就行,这里的算法运算符会指定将对象转为原始类型后,再强制转为数字类型。
var obj1 = {
valueOf: function() {
return "4"
},
toString: function() {
return 5
}
}
5 - obj1 // 1; 相当于 5 - "4", 然后 5 - 4