先看问题:
好家伙,不就是比较一下大小吗,怎么结果还不一样了。这是因为>在比较时,进行了隐式类型转换。
结论:
简单类型进行比较时,会尝试隐式转换为数字型,再进行比较。字符型和字符型比较除外。
字符串比较:
字符串比较采用字典序(lexicographical order),即逐字符按 Unicode 编码进行比较,而不进行数值转换。
console.log('2' > '10'); // true,因为比较的是第一个字符 '2' 和 '1'
console.log('apple' > 'banana'); // false,因为 'a' < 'b'
字符串与数字比较
字符串会隐式转换为数字。当一个字符串不能转换为有效的数值时,会导致 NaN,与 NaN 的任何比较都返回 false。
console.log("abc" > 0); // false, 因为 "abc" 无法转换为有效数值,结果为 NaN
console.log("123" > 100); // true, 因为 "123" 可以转换为数值 123
数字与数字比较
不涉及类型转换。
console.log(5 > 3); // true
console.log(2 > 4); // false
布尔值与其他类型比较
布尔值会被转换为数值:true 转换为 1,false 转换为 0。其他类型也会被转为数值型。
console.log(true > 0); // true, 因为 true 被转换为 1
console.log(false > -1); // true, 因为 false 被转换为 0
null和undefined比较
null会被转换为数值0undefined会被转换为NaN,而与NaN的任何比较都会返回false。
console.log(null > 0); // false, 因为 null 被转换为 0
console.log(undefined > 0); // false, 因为 undefined 被转换为 NaN
console.log(null > undefined); // false, 因为 null 被转换为 0,undefined 被转换为 NaN
对象和原始类型比较
当涉及对象时,对象首先通过调用其 toPrimitive 方法(通常是 valueOf 或 toString 方法)转换为原始类型,然后再进行比较。
let obj = { valueOf: () => 10 };
console.log(obj > 5); // true, 因为 obj 被转换为 10
let anotherObj = { toString: () => "20" };
console.log(anotherObj > 15); // true, 因为 anotherObj 被转换为字符串 "20",然后再转换为数值 20