JavaScript不同类型比较及隐式转换

81 阅读2分钟

先看问题:

image.png

好家伙,不就是比较一下大小吗,怎么结果还不一样了。这是因为>在比较时,进行了隐式类型转换。

结论:

简单类型进行比较时,会尝试隐式转换为数字型,再进行比较。字符型和字符型比较除外

字符串比较:

字符串比较采用字典序(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 转换为 1false 转换为 0。其他类型也会被转为数值型。

console.log(true > 0); // true, 因为 true 被转换为 1
console.log(false > -1); // true, 因为 false 被转换为 0

null和undefined比较

  • null 会被转换为数值 0
  • undefined 会被转换为 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 方法(通常是 valueOftoString 方法)转换为原始类型,然后再进行比较。

let obj = { valueOf: () => 10 };
console.log(obj > 5); // true, 因为 obj 被转换为 10

let anotherObj = { toString: () => "20" };
console.log(anotherObj > 15); // true, 因为 anotherObj 被转换为字符串 "20",然后再转换为数值 20