对于非相等的比较,算法是先看两个运算子是否全是字符串,如果都是字符串的话,就按照Unicode码的大小一个字符一个字符来比较;否则的话,将两个运算子都转成数值,再比较大小
var x = [2]; // 输出true // x的valueOf()返回[2],是对象类型,所以再调用toString(),结果是"2">"11",因为两个都是字符串,所以先比较第一个字符,"2">"1",返回true x > '11' x.valueOf = function(){ return '2'; } // 返回false,因为x是对象,对象的比较先调用对象的valueOf()将对象转为原始值类型,x的valueOf()方法返回的是基本类型,不再调用toString(),结果为'2'>'21',返回false x > '21'
相等运算符(==)比较的是两个值是否相等,严格相等运算符(===)比较是否为'同一个值'; '==='先比较类型,如果类型不一样,则直接返回false, '=='会先将他们转换为同一个类型,再用严格相等运算符进行比较
两个复合类型(对象,数组,函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个地址
注意: 对于两个对象的比较,严格运算符比较的是地址,而大于或小于运算符比较的是值
严格不相等运算符的算法是先求严格运算符的结果,然后再返回相反值
相等运算符比较同类型的数据时,与严格相等运算符完全一样;比较不同类型的数据时,相等运算符会先将数据类型转换,然后再用严格相等运算符比较
// 等同于1 === Number(true) 1 == true // true // false 等同于 Number('true') === Number(true) ==> NaN === 1 'true' == true
// 对象与数值类型比较,对象转为数值 // true 等同于 Number([2]) == 2 [2] == 2 // 对象与字符串比较,对象转为字符串 // true 等同于 String([3,4]) == '3,4' [3,4] == '3,4' // 对象与布尔值比较,两边都转为数值 // false 等同于 Number([5]) == Number(true) [5] == true
它的算法就是先求相等运算符的结果,然后再返回相反值