下面把 JS 里所有比较运算符按"长相"→"功能"→"坑点"→"记忆口诀"四步拆开讲,看完就能当"人肉 linter"。
- 相等族(宽松)
==
功能:先强制类型转换 再比较。
坑点:0 == false// true'' == false// true' \t\r\n' == 0// truenull == undefined// true,且仅此一对"特权"
口诀:
"== 带隐式,五条怪规则:布尔转数、字符串转数、null 只约 undefined、对象转原始、NaN 谁都不认。"
- 相等族(严格)
===
功能:不做类型转换,类型不同直接 false 。
坑点:NaN === NaN// false(唯一自己不等于自己)+0 === -0// true(符号位被忽略)
口诀:
"=== 不带戏,类型不同就枪毙。"
- 不等族
!=与!==
功能:分别对应==和===的逻辑反 。
坑点:5 != '5'// false(因为先转类型后相等)5 !== '5'// true
口诀:
"叹号在前,就是取反,宽松严格各自算。"
- 顺序族(数字语义)
<><=>=
功能:- 两边都是字符串 → 按 Unicode 码点逐位比(字典序)。
- 否则 → 两边都先转数字 再比。
坑点: '10' > '2'// false(字符串比,'1'<'2' 直接出局)'10' > 2// true(转数字 10>2)null >= 0// true(null 转 0)undefined >= 0// false(undefined 转数字得 NaN,任何比较都 false)
口诀:
"同为字符串才字典,其余一律先转数;null 变 0,undefined 变 NaN,NaN 出马全 false。"
-
对象比较彩蛋
功能:对象先调用ToPrimitive(先valueOf再toString),变成原始值后再走上面规则。
例子:jsvar a = [1]; var b = [2]; a < b // true → [1].valueOf() 得 '1',再转数字 1 < 2
-
NaN、±0 小结表
表达式 结果 原因 NaN == NaN false IEEE 754 规定 +0 == -0 true 同值零 Object.is(NaN, NaN) true ES6 提供的"最严格"比较 Object.is(+0, -0) false 可区分符号零
速记总口诀
"三等不带戏,双等带隐式;
字符串字典序,别的先转数;
null 特权遇 undefined,NaN 出现全是拒;
对象先拆箱,比较不迷路。"