Array.prototype.includes()类型严格匹配反直觉?是否需JavaScript修正?
聊聊 Array.prototype.includes 的严格相等设计:为啥它不做类型转换?
先明确核心点:includes 用的是 === 而非 ==
你遇到的问题本质是:includes 内部采用严格相等比较,要求值和类型完全匹配,而不是松散相等的自动类型转换。这是刻意的设计,不是bug。
这种设计真的有必要吗?
绝对有,原因有三:
- 避免松散相等的“玄学”行为:JavaScript的松散相等规则太反直觉了——比如
0 == ''、[] == ![]这种逻辑,如果includes用了==,你想查找数组里的false,结果连0和''都会被匹配到,完全偏离预期。严格相等能让查找逻辑完全可控,不会出现莫名其妙的匹配结果。 - 和已有API保持一致:
indexOf方法早就用严格相等了,includes作为它的语义化替代(返回布尔值比返回-1更直观),沿用相同的比较逻辑,能减少开发者的记忆负担,不用额外区分两个方法的差异。 - 代码逻辑更清晰:严格相等要求你明确知道自己要找的是什么类型的元素,比如是字符串'3'还是数字3,这种明确性能让后续维护代码的人一眼看懂逻辑,减少隐性bug。
要不要修正这个特性?
完全没必要。如果确实需要松散相等的查找,自己用 some 写一行代码就行:
['1','2','3'].some(item => item == 3); // 结果是 true
includes 的定位是提供一个无歧义、可靠的基础工具,而不是包揽所有场景。JavaScript本身足够灵活,自定义逻辑成本很低,没必要修改核心API的行为——不然反而会让依赖严格相等的老代码出问题。
不注意类型匹配会踩什么坑?
就像你在数独求解器里遇到的情况:
- 处理用户输入、DOM值(比如input的value都是字符串)、接口返回数据时,很容易出现类型不统一的情况。如果直接用
includes查找不同类型的值,会得到错误的判断结果,导致逻辑走岔路——比如本该匹配成功的数独数字被漏掉,程序运行异常。 - 这种bug排查起来特别费时间,因为表面上看值是对的,类型差异藏在底层,不特意打印
typeof根本发现不了。
最后总结
includes 的严格相等设计是合理且必要的,它避开了松散相等的混乱,保证了API的一致性和可预测性。用的时候多留意元素类型,或者按需自己实现松散查找就行。
内容的提问来源于stack exchange,提问作者Sathish Kannan
相关产品推荐
相关产品推荐

