JavaScript中==会隐式转换类型后比较,===要求类型和值都严格一致;如0==false为true,但0===false为false;开发中应优先使用===避免意外bug。
JavaScript 中的类型转换和 == 与 === 的区别,核心在于“是否自动做类型转换”。== 会先尝试把两边转成相同类型再比较,=== 则要求值和类型都完全一致,不转换。
当使用 == 比较两个不同类型的值时,JavaScript 引擎会按一套规则强行转换其中至少一个值的类型,再进行比较。这个过程容易出人意料:
0 == false → true(false 被转为 0)"" == false → true(空字符串转为 0,再和 false 转的 0 相等)"1" == 1 → true(字符串 "1" 被转为数字 1)null == undefined → true(这是特例,但 null === undefined 是 false)[] == false → true(空数组先转字符串 "",再转数字 0,等于 false 转来的 0)=== 完全跳过类型转换步骤。只要类型不同,立刻返回 false,哪怕看起来“应该相等”:
"1" === 1 → false(字符串 vs 数字)true === 1 → false(布尔 vs 数字)null === undefined → false(类型不同)0 === false → false
{} === {} → false(对象比较的是引用,不是内容)绝大多数场景下,推荐无条件使用 ===:
if (value == "0") 可能误判 false、""、0、[] 等===,别人一眼知道你关心“值和类型都对”==,除非显式加注释说明需要松散比较null 或 undefined:value == null 可同时捕获两者(等价于 value === null || value === undefined),但更推荐用 value == null 或明确写全如果真需要比较前转换类型,就自己控制,别依赖 == 的黑盒逻辑:
Number(str)、parseInt(str)、parseFloat(str),注意 Number("") 是 0,而 parseInt("") 是 NaN
Boolean(val) 或 !!val(更常用)String(val) 或 val + ""
String(a) === String(b) 或 Number(a) === Number(b)
不复杂但容易忽略:一次隐式转换可能牵出一连串意外结果,而 === 让行为可预测、可推演。