当前位置: 首页 > backend >正文

JavaScript == 和 ===区别,分别在什么情况使用?

一、区别:像“自动换币” vs “严格核对”

  1. ==(宽松相等)

    • 动作:自动换币机。
      如果两边的“货币类型”不同(比如数字和字符串),它会先帮你转换成同一种类型,再比较值。
    • 例子
      5 == "5"  // true(字符串"5"自动转成数字5)
      0 == false // true(false转成数字0)
      [] == ""  // true(空数组转成空字符串"")
      
  2. ===(严格相等)

    • 动作:银行验钞机。
      必须类型和值完全相同才返回 true,不帮你做任何转换。
    • 例子
      5 === "5"  // false(类型不同)
      0 === false // false(类型不同)
      [] === ""  // false(类型不同)
      

二、常见对比场景

场景1:数字 vs 字符串
  • ==转成数字比较:
    10 == "10"     // true("10"转成10)
    "3.14" == 3.14 // true
    
  • === 直接拒绝:
    10 === "10"    // false(类型不同)
    
场景2:布尔值 vs 其他类型
  • ==转成数字比较:
    true == 1      // true(true转成1)
    false == 0     // true(false转成0)
    true == "1"    // true("1"转成1 → true)
    
  • === 必须严格匹配:
    true === 1     // false(类型不同)
    
场景3:特殊值(null、undefined、NaN)
  • == 的潜规则:
    null == undefined    // true(特殊规定)
    NaN == NaN           // false(NaN不等于任何值,包括自己)
    
  • === 严格模式:
    null === undefined   // false(类型不同)
    NaN === NaN          // false
    

三、什么时候用 ==?什么时候用 ===

1. 优先使用 ===(推荐99%的场景)
  • 原因:避免隐式转换导致的意外结果,代码更安全。
  • 例子
    if (user.id === "123") { ... }  // 明确类型和值都要匹配
    
2. 少数情况可以用 ==
  • 场景
    • 检查变量是否为 nullundefined(简写):
      if (value == null) { ... }  
      // 等价于 value === null || value === undefined
      
    • 处理接口返回的松散类型数据(如字符串数字转数字):
      if (apiData.id == 123) { ... }  
      // 兼容接口可能返回字符串"123"
      
  • 注意:需明确知道转换规则,否则容易踩坑!

四、避坑口诀

  • 能用 === 不用 ==
  • 特殊值用 Object.is()(处理 NaN+0/-0
    Object.is(NaN, NaN)  // true(特殊处理)
    Object.is(0, -0)     // false
    

总结

  • ==:像自动换币机,方便但有风险(可能换错钱)。
  • ===:像验钞机,严格但安全(钱和类型都要对)。
  • 原则:除非明确需要类型转换,否则一律用 ===
http://www.xdnf.cn/news/3001.html

相关文章:

  • 角度(degrees)和弧度(radians)转换关系
  • Oracle OCP证书有效期是三年?
  • 5 个开源 MCP 服务器
  • 【MongoDB篇】MongoDB的集合操作!
  • 【angular19】入门基础教程(四):默认的css隔离作用域
  • 基于Java,SpringBoot,HTML水文水质监测预警系统设计
  • 【最新 MCP 战神手册 08】工具使用详解:实现 AI 行动
  • 动态图表 -- eg1
  • Femap许可分配和监控
  • 4月29日星期二今日早报简报微语报早读
  • 优化PCB Via Stub系列(1):一次学会利用层叠设计降低Via Stub损耗
  • 使用 Ziegler-Nichols 法进行 PID 参数整定:实践指南
  • [计算机网络]物理层
  • 力扣-数据结构-二叉树
  • 3D可视化编辑器模版
  • AimRT 从零到一:官方示例精讲 —— 四、logger示例.md
  • 信创产业贡献︱悬镜安全深度参编《2024网信自主创新调研报告》
  • 监控易一体化运维:解锁业务系统管理,助力企业运维升级
  • SOLIDWORKS广东东莞地区代理商哪个服务好?都有哪些代理商?
  • docker 部署前、后端分离项目详细步骤(从打包到部署)
  • 嵌入式学习笔记 - 关于STM32 SPI控制器读取以及写入时,标志位TXE, RXNE的变化
  • 文献阅读(二)植被恢复力变化对不同干旱类型的空间异质性|《Earth‘s Future》
  • 第八章 磁盘管理未完待续
  • 关闭正点原子atk-qtapp-start.service
  • 使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(一)
  • 解决vue3 路由query传参刷新后数据丢失的问题
  • [MySQL数据库] InnoDB存储引擎(四): InnoDB磁盘文件
  • 基于Spring Boot+Vue 网上书城管理系统设计与实现(源码+文档+部署讲解)
  • C# 中重启程序通常意味着关闭当前运行的应用程序实例
  • 【语法】C++的继承