JavaScript比较运算符共8个:==、===、!=、!==、>、>=、

JavaScript 中的比较运算符有哪些
JavaScript 的比较运算符共 8 个,全部返回布尔值:==、===、!=、!==、>、>=、、。其中 == 和 != 会触发类型转换,=== 和 !== 是严格相等(不转换类型),其余四个是数值/字符串字典序比较,但实际行为受操作数类型影响很大。
为什么 == 在比较 null 和 undefined 时“看起来合理”,但其他时候很危险
null == undefined 返回 true,这是语言规范特例;但除此之外,== 的抽象相等算法会导致大量反直觉结果:
-
0 == false→true(false转为0) -
"0" == false→true(两边都转成0) -
"" == 0→true(空字符串转为0) -
[] == ![]→true(左边转为空字符串再转0,右边![]是false,再转0)
这些不是 bug,是规范定义的行为,但几乎从不被业务逻辑需要。现代代码中应无条件禁用 == 和 !=,ESLint 规则 eqeqeq 就是为此而设。
> 和 比较字符串和数字时到底在比什么
当比较操作数类型不同时,JavaScript 会尝试将它们转为同一类型再比较,但规则和 == 不同:它优先转为数字(除非两边都是字符串)。
立即学习“Java免费学习笔记(深入)”;
-
5 > "3"→true("3"转为3,再比较) -
5 > "hello"→false("hello"转为NaN,任何NaN比较都返回false) -
"5" > "3"→true(字典序比较,字符'5'Unicode 值大于'3') -
"5" > "30"→true(字典序:先比首字符'5'vs'3',已分出大小,不看后面)
这意味着 "10" 是 true,但 10 是 false。如果本意是比较数值大小,必须显式转换:Number(a) 或 +a 。
对象和数组用 === 比较永远是 false?那怎么判断内容相等
是的。=== 对对象、数组、函数等引用类型,只比较内存地址是否相同,不比较内容:
const a = [1, 2]; const b = [1, 2]; console.log(a === b); // false console.log(a === a); // true
要比较内容是否一致,需手动实现或借助工具:
- 简单数组(仅基础类型):用
JSON.stringify(a) === JSON.stringify(b)(注意:不能处理undefined、函数、循环引用、属性顺序差异) - 深度比较:用 Lodash 的
_.isEqual(),或自己写递归函数(需处理null、日期、正则、Set/Map 等) - React 场景下做 props 比较:推荐
shallowEqual(React 自带)或fast-deep-equal(轻量)
没有银弹。每次想“比较两个对象是否一样”,先问清楚:是想确认是不是同一个实例(用 ===),还是想确认结构和值是否等价(必须走深比较逻辑)——后者永远有成本和边界。











