相同类型比较
- 字符串:比较字符串的 utf-16 编码(通过
charCodeAt进行转换)从字符串中索引 1 开始比较,如果相等则继续比较第二位,直到比出大小,如果存在其中一个字符串率先比完,还没比出大小,则长度长的较大
"aa" > "a"; // true
"ab" > "aa"; // true
- 数字、BigInt:没啥好说的,比大小就完了
- 布尔值:记住
ture > false - undefine、null:
undefined===undefined、null ===null,直接相等,怎么比都是 false - Symbol:没法比大小
- 对象:先调用对象的
valueOf方法进行比较,如果相等,再调用toString方法进行比较
var a = { data: [20, 20], value: 20 };
var b = { data: [10, 30], value: 10 };
a > b; // false
a < b; // false
a.valueOf = function() {
return this.value; // 20
};
b.valueOf = function() {
return this.value; // 10
};
a > b; // true
a < b; // false
不同类型进行比较
如果是不同类型进行比较的话,会先将需要比较的值进行Number()转换,然后再进行比较。
如果经过转化以后的值是NaN的话,就比较不出大小了。除了数字字符串,其他类型经过Number()转化后,大部分都是NaN。下面列出一些特殊情况
console.log(Number("")); // 0
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log(Number(null)); // 0
console.log(Number([x])); // x
注意Number只能转化长度为 1 的数组
思考
所以看完以上的你能否解释一下为什么![]==[]是true