news 2026/4/27 4:15:20

[JavaScript] Object.is()、==、=== 之间的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[JavaScript] Object.is()、==、=== 之间的区别

在 JavaScript 中,== 、===和 Object.is() 是三种常见的相等性判断方式。它们的主要区别在于类型转换行为以及对 NaN、+0/-0 的特殊处理。

核心区别速览

特性==(宽松相等)===(严格相等)Object.is()(精确相等)
类型转换会隐式转换不转换,类型不同直接false不转换,类型不同直接false
1 == '1'truefalsefalse
null == undefinedtruefalsefalse
NaN == NaNfalsefalsetrue
+0 == -0truetruefalse
推荐场景现代开发不推荐或需要自动转换时(慎用)日常开发首选,绝大多数比较场景需要精确处理NaN+0/-0

==(宽松相等

  • 会进行类型转换(强制类型转换),再比较值是否相等。
  • 规则较复杂,常见场景:
    • null == undefined → rue
    • 字符串和数字比较时,字符串会转为数字:'5' == 5 → true
    • 布尔值与其他类型比较时,布尔值先转为数字:true == 1 → true
    • 对象与原始值比较时,对象会尝试转成原始值(valueOf/toString)
  • 缺点:规则复杂、容易引发难以排查的 Bug,现代 JS 规范(如 Airbnb 规范)明确建议禁用==
0==false// true (false 转为 0)''==false// truenull==undefined// true1=='1'// true ('1' 转为 1)NaN==NaN// false

===(严格相等)

  • 不进行类型转换,类型不同直接返回false
  • 类型相同时,按值比较:
    • 基本类型:值相同即true
    • 对象/数组/函数:比较的是引用地址,而非内容
  • 但是有两个“反直觉”的特性:
    • NaN === NaN返回false(按照 IEEE 754 标准,NaN 不等于自身)
    • +0 === -0返回true(+0 和 -0 被视为相等)
1==='1'// falsenull===undefined// falseNaN===NaN// false+0===-0// true{}==={}// false

Object.is()(同值相等)

  • 行为基本与===相同,但对两个特殊情况做了修正:
    • Object.is(NaN, NaN)返回true
    • Object.is(+0, -0)返回false
  • 除此之外,和===判断结果完全一致(不进行类型转换)。
Object.is(1,'1')// falseObject.is(null,undefined)// falseObject.is(NaN,NaN)// trueObject.is(+0,-0)// falseObject.is(0,-0)// falseObject.is(0,+0)// true

  • 适用场景:
    • 需要准确判断NaN(如实现缓存键比对、状态管理)
    • 需要区分+0-0(如数学计算、Canvas/WebGL 底层逻辑)
    • 库/框架内部实现(如 React 的Object.is用于判断 props 是否变化)

最佳实践建议

需求推荐写法
常规相等判断a === b
判断是否为NaNNumber.isNaN(a)Object.is(a, NaN)
区分正负零Object.is(a, -0)
比较对象/数组内容是否相同使用深比较库(如 lodash.isEqual)
遗留代码中见到==逐步替换为===,并补充类型校验

代码示例对比

// 类型转换差异console.log(1=='1');// trueconsole.log(1==='1');// falseconsole.log(Object.is(1,'1'));// false// NaN 处理console.log(NaN==NaN);// falseconsole.log(NaN===NaN);// falseconsole.log(Object.is(NaN,NaN));// true// 正负零处理console.log(+0==-0);// trueconsole.log(+0===-0);// trueconsole.log(Object.is(+0,-0));// false// 对象引用consta={x:1};constb={x:1};console.log(a==b);// falseconsole.log(a===b);// falseconsole.log(Object.is(a,b));// false

使用建议

  • 大多数情况优先用===,避免隐式转换带来的意外。
  • 当需要判断某个值严格是NaN或者需要区分+0-0时,再考虑Object.is()(或直接用Number.isNaN()
  • ==很少使用,除非明确需要null == undefined这类特性,或处理一些老代码。

简单总结:

==有类型转换,最宽松;
===无类型转换,但不分辨 NaN 和 +0/-0;
Object.is()是更精确的严格相等,修正了 NaN 和带符号零的比较。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 4:14:23

通用策略引擎OPA:云原生架构下的策略即代码实践

1. 项目概述:为什么我们需要一个“通用策略引擎”?在云原生和微服务架构大行其道的今天,我们构建的应用越来越复杂,服务间的交互、资源的访问控制、数据的合规性检查,这些策略逻辑往往像藤蔓一样缠绕在业务代码的各个角…

作者头像 李华
网站建设 2026/4/27 4:14:21

读懂AI产品的项目定位与核心功能(豆包聊天、WPS AI 工具)

目录 案例一:豆包聊天——全场景AI智能助手,从“对话”到“生产力中枢” 核心功能剖析(贴合定位,精准落地) 1. 基础聊天交互:定位落地的核心载体 2. 多模态创作:全场景生产力的核心支撑 3. …

作者头像 李华
网站建设 2026/4/27 4:06:41

FastAPI在机器学习模型部署中的关键实践

1. 为什么模型部署是机器学习工作流的关键环节在真实业务场景中,训练好的机器学习模型如果不能转化为可用的API服务,其价值几乎为零。我见过太多团队花费数月优化模型指标,却在最后部署环节功亏一篑。模型部署本质上是要解决三个核心问题&…

作者头像 李华
网站建设 2026/4/27 4:06:39

OptiLLM:无需训练,通过推理优化代理将大模型准确率提升2-10倍

1. 项目概述:推理优化的“魔法”代理如果你正在用大模型(LLM)处理数学题、写代码或者做逻辑推理,大概率遇到过这种情况:同一个问题,模型这次答对了,下次换个问法或者温度参数,它又错…

作者头像 李华
网站建设 2026/4/27 4:05:46

给硬件新手的DDR3内存扫盲:从核心频率到CL时序,一次讲清楚

给硬件新手的DDR3内存扫盲:从核心频率到CL时序,一次讲清楚 当你第一次拆开电脑主机或嵌入式开发板,看到主板上那些排列整齐的内存条时,是否好奇过这些小小的电路板是如何以每秒数十亿次的速度与处理器对话的?DDR3作为曾…

作者头像 李华