JavaScript如何用Object.is进行严格比较

object.is与===的核心区别在于对nan和带符号零的处理。1. nan比较:object.is(nan, nan)返回true,而nan === nan为false;2. +0与-0比较:object.is(+0, -0)返回false,而===认为它们相等。其他情况下二者行为一致,均不进行类型转换且对象比较基于引用。

JavaScript如何用Object.is进行严格比较

在JavaScript的世界里,判断两个值是否相等,我们通常会想到=====。但如果我告诉你,还有一个更“较真”的选手,它能处理连===都搞不定的细微差别,那就是Object.is()。简单来说,它提供了一种极致的严格比较,尤其是在区分+0-0NaN这些特殊值时,它能确保你得到的是真正意义上的精确匹配。

JavaScript如何用Object.is进行严格比较

解决方案

Object.is()方法用于判断两个值是否是相同的值。它在行为上与===(严格相等运算符)非常相似,但在两个关键的边缘情况上有所不同:

NaN的比较Object.is(NaN, NaN)返回true,而NaN === NaN返回false+0-0的比较Object.is(+0, -0)返回false,而+0 === -0返回true

在所有其他情况下,Object.is()的行为与===完全相同。它不会进行类型转换,所以像Object.is(1, '1')这样的比较会返回false。对于对象(包括数组和函数),Object.is()只在它们引用同一个内存地址时才返回true,即进行引用比较,而不是值比较。

立即学习“Java免费学习笔记(深入)”;

JavaScript如何用Object.is进行严格比较

这背后的逻辑是,Object.is()遵循的是ECMAScript规范中的“SameValue”算法,而===遵循的是“Strict Equality Comparison”算法。SameValue算法在处理NaN和带符号的零时,对值的“身份”有更严格的定义。

代码示例:

JavaScript如何用Object.is进行严格比较

// 基础比较,与 === 行为一致console.log(Object.is(25, 25));               // trueconsole.log(Object.is('foo', 'foo'));         // trueconsole.log(Object.is('foo', 'bar'));         // falseconsole.log(Object.is(null, null));           // trueconsole.log(Object.is(undefined, undefined)); // trueconsole.log(Object.is(window, window));       // trueconsole.log(Object.is([], []));               // false (不同对象引用)let a = {};console.log(Object.is(a, a));                 // true (相同对象引用)console.log(Object.is(1, '1'));               // false (不同类型,无类型转换)// 关键区别:NaNconsole.log(Object.is(NaN, NaN));             // trueconsole.log(NaN === NaN);                     // false// 关键区别:+0 和 -0console.log(Object.is(0, -0));                // falseconsole.log(0 === -0);                        // trueconsole.log(Object.is(0, +0));                // trueconsole.log(Object.is(-0, -0));               // true

在我看来,这种“较真”在某些场景下是很有必要的。比如说,你可能真的需要区分一个数值是正向的零还是负向的零,这在某些图形计算或者物理模拟中或许有实际意义。而NaN与自身相等,这在处理不确定数值时,往往比它不相等更符合直觉。

Object.is===操作符的核心区别是什么?

要理解Object.is的独特之处,就得把它和我们更熟悉的===操作符拎出来对比一下。说实话,它们绝大部分时候的表现是一致的,但在两个非常特定的边缘案例上,它们分道扬镳了,这也是Object.is存在的最大理由。

1. NaN的自我比较:这是最常见的“JavaScript怪癖”之一。在JavaScript中,NaN(Not-a-Number)是一个非常特别的值,它的设计初衷就是为了表示那些无法表示的数值结果。所以,NaN === NaN的结果是false,这有时候让人很头疼,因为你无法直接用===来判断一个变量是不是NaN

console.log(NaN === NaN); // false

Object.is在这里就显得“正常”多了,它认为NaN就是NaN,它们是同一个“非数字”的值:

console.log(Object.is(NaN, NaN)); // true

这让检查一个值是否为NaN变得更直观,如果你不想使用isNaN()(因为isNaN('hello')也会返回true,它有自己的类型转换逻辑),那么Object.is(myValue, NaN)是一个更精确的选择。

2. +0-0的区分:在IEEE 754浮点数标准中,是存在正零(+0)和负零(-0)的概念的。虽然它们在数学上都代表零,但在某些底层计算或表示方向的场景下,区分它们可能是有意义的。然而,===操作符在比较它们时,会认为它们是相等的:

console.log(0 === -0);  // trueconsole.log(+0 === -0); // true

Object.is则不然,它认为+0-0是两个不同的值,因为它更关注值的“身份”而非单纯的数值:

console.log(Object.is(0, -0));  // falseconsole.log(Object.is(+0, -0)); // false

除了这两个点,其他所有情况,Object.is===的行为都保持一致。它们都进行严格比较,不进行类型强制转换,并且对于对象,都只比较引用是否相同。所以,Object.is并不是===的完全替代品,它更像是===的一个“补丁”,用来处理那些===显得不够严格的边缘情况。

在哪些场景下,Object.is会是你的首选比较工具

虽然Object.is在日常开发中可能不像===那样高频出现,但在一些特定且关键的场景下,它确实能派上大用场,甚至可以说,它是解决某些问题的“最佳实践”。

1. 精确判断NaN值:这是Object.is最常见的用例之一。当你的程序可能产生NaN(比如数学运算失败、解析字符串为数字失败等),并且你需要精确地知道一个变量是否就是NaN本身时,Object.is(value, NaN)比其他方法更可靠。比如,你从一个API获取了一个可能无效的数值,或者在处理用户输入时,想知道用户输入的是否真的是一个“非数字”的值。传统的isNaN()函数会把字符串'hello'也判断为true,这在某些情况下可能不是你想要的。

function isExactlyNaN(val) {  return Object.is(val, NaN);}console.log(isExactlyNaN(0 / 0));      // trueconsole.log(isExactlyNaN(parseInt('abc'))); // trueconsole.log(isExactlyNaN('hello'));    // false (而 isNaN('hello') 是 true)

2. 区分+0-0的数值逻辑:这听起来可能有点钻牛角尖,但有时候,正是这些看似微不足道的细节,决定了代码的健壮性。在一些涉及浮点数运算、图形渲染(比如SVG路径的绘制方向)、物理模拟或金融计算的场景中,+0-0可能携带了方向或状态信息。例如,一个表示速度的零值,其符号可能指示了物体是从哪个方向停止的。

function processZeroValue(value) {  if (Object.is(value, -0)) {    console.log("处理负零:可能表示从负方向趋近于零或特定边界条件。");  } else if (Object.is(value, +0)) {    console.log("处理正零:可能表示从正方向趋近于零或标准零。");  } else {    console.log("这不是一个零值。");  }}processZeroValue(0);  // 处理正零processZeroValue(-0); // 处理负零

3. 框架和库的内部状态管理:一些高级的JavaScript框架或库,特别是在实现响应式系统或虚拟DOM diff算法时,可能会在内部使用Object.is来判断一个值是否真的发生了变化,从而决定是否需要重新渲染或触发更新。这种精确的比较可以避免不必要的计算和性能开销,尤其是在处理那些可能出现NaN或带符号零的复杂数据结构时。它能确保只有当数据真正“不同”时才执行操作。

所以,当你需要对值的“身份”进行极度精确的匹配,尤其是在处理数值的边缘情况时,Object.is就是那个能让你代码更严谨、更可靠的工具。

Object.is的兼容性如何?使用时有什么需要注意的“陷阱”吗?

Object.is是一个非常实用的特性,但就像任何工具一样,了解它的兼容性和潜在的“陷阱”是至关重要的,这样才能避免踩坑。

比格设计 比格设计

比格设计是135编辑器旗下一款一站式、多场景、智能化的在线图片编辑器

比格设计 124 查看详情 比格设计

兼容性方面:

Object.is是在ES6(ECMAScript 2015)中引入的。这意味着,对于现代的JavaScript开发环境,它的兼容性是相当不错的。

现代浏览器 Chrome、Firefox、Safari、Edge等主流浏览器的最新版本都完全支持Object.is

Node.js: Node.js环境也从很早的版本就开始支持Object.is

IE浏览器: Internet Explorer 11及以下版本不支持Object.is。不过,考虑到IE的市场份额已经非常小,并且很多现代Web应用已经不再支持IE,这通常不是一个大问题。

Polyfill: 如果你确实需要兼容非常老的浏览器环境,可以通过polyfill来引入Object.is的功能。一个简单的polyfill实现可能看起来像这样(仅为示例,实际使用请选择成熟的polyfill库):

if (!Object.is) {  Object.is = function(x, y) {    if (x === y) {      // 处理 +0 === -0 的情况      return x !== 0 || 1 / x === 1 / y;    } else {      // 处理 NaN === NaN 的情况      return x !== x && y !== y;    }  };}

总的来说,在绝大多数现代Web开发项目中,你可以放心地使用Object.is,而无需过多担心兼容性问题。

使用时的“陷阱”:

尽管Object.is很强大,但它并不是一个可以随意替换===的万能钥匙。以下是一些你可能需要注意的“陷阱”:

不是===的完全替代品: 这是最需要强调的一点。Object.is只是在NaN和带符号零的特定情况下比===更严格。在其他所有情况下,它们的行为是相同的。如果你不需要区分+0-0,也不需要NaNNaN相等,那么继续使用===可能更符合你的直觉,也更简洁。无脑地将所有===替换为Object.is,不仅可能导致不必要的性能开销(尽管微乎其微),也可能让代码的意图变得不那么清晰。

对象比较依然是引用比较: 很多人会误以为Object.is能进行对象的深层值比较,但事实并非如此。就像===一样,Object.is在比较非原始值(对象、数组、函数等)时,仍然只比较它们的引用是否指向同一个内存地址。

const obj1 = { a: 1 };const obj2 = { a: 1 };console.log(Object.is(obj1, obj2)); // false (不同引用)console.log(Object.is(obj1, obj1)); // true (相同引用)

如果你需要进行深层比较,你需要自己实现一个递归比较函数,或者使用lodash等库提供的工具。

性能考量(通常可忽略): Object.is是一个函数调用,而===是一个运算符。理论上,函数调用会比直接的运算符操作带来微小的性能开销。但在绝大多数实际应用中,这种差异几乎可以忽略不计,除非你在一个极度性能敏感的循环中每秒执行数百万次比较。所以,不要因为这个原因而放弃在需要时使用Object.is

过度使用可能降低可读性: 如果你的业务逻辑根本不关心+0-0的区别,也不需要NaN的特殊处理,那么坚持使用===会让代码更符合“最小惊讶原则”。使用Object.is反而可能让读者疑惑,是不是这里有什么特别的数值处理需求。

总之,Object.is是一个精准的工具,它解决了===在特定边缘情况下的不足。理解它的设计意图和适用场景,能帮助你编写出更健壮、更精确的JavaScript代码。

以上就是JavaScript如何用Object.is进行严格比较的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/254879.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月4日 06:50:47
下一篇 2025年11月4日 06:54:36

相关推荐

  • soul怎么发长视频瞬间_Soul长视频瞬间发布方法

    可通过分段发布、格式转换或剪辑压缩三种方法在Soul上传长视频。一、将长视频用相册编辑功能拆分为多个30秒内片段,依次发布并标注“Part 1”“Part 2”保持连贯;二、使用“格式工厂”等工具将视频转为MP4(H.264)、分辨率≤1080p、帧率≤30fps、大小≤50MB,适配平台要求;三、…

    2025年12月6日 软件教程
    500
  • AO3镜像站备用镜像网址_AO3镜像站快速访问官网

    AO3镜像站备用网址包括ao3mirror.com和xiaozhan.icu,当主站archiveofourown.org无法访问时可切换使用,二者均同步更新内容并支持多语言检索与离线下载功能。 AO3镜像站备用镜像网址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来AO3镜像站快速访问官…

    2025年12月6日 软件教程
    100
  • 天猫app淘金币抵扣怎么使用

    在天猫app购物时,淘金币是一项能够帮助你节省开支的实用功能。掌握淘金币的抵扣使用方法,能让你以更实惠的价格买到心仪商品。 当你选好商品并准备下单时,记得查看商品页面是否支持淘金币抵扣。如果该商品支持此项功能,在提交订单的页面会明确显示相关提示。你会看到淘金币的具体抵扣比例——通常情况下,淘金币可按…

    2025年12月6日 软件教程
    500
  • Pboot插件缓存机制的详细解析_Pboot插件缓存清理的命令操作

    插件功能异常或页面显示陈旧内容可能是缓存未更新所致。PbootCMS通过/runtime/cache/与/runtime/temp/目录缓存插件配置、模板解析结果和数据库查询数据,提升性能但影响调试。解决方法包括:1. 手动删除上述目录下所有文件;2. 后台进入“系统工具”-“缓存管理”,勾选插件、…

    2025年12月6日 软件教程
    100
  • Word2013如何插入SmartArt图形_Word2013SmartArt插入的视觉表达

    答案:可通过四种方法在Word 2013中插入SmartArt图形。一、使用“插入”选项卡中的“SmartArt”按钮,选择所需类型并插入;二、从快速样式库中选择常用模板如组织结构图直接应用;三、复制已有SmartArt图形到目标文档后调整内容与格式;四、将带项目符号的文本选中后右键转换为Smart…

    2025年12月6日 软件教程
    000
  • 《kk键盘》一键发图开启方法

    如何在kk键盘中开启一键发图功能? 1、打开手机键盘,找到并点击“kk”图标。 2、进入工具菜单后,选择“一键发图”功能入口。 3、点击“去开启”按钮,跳转至无障碍服务设置页面。 4、在系统通用设置中,进入“已下载的应用”列表。 j2me3D游戏开发简单教程 中文WORD版 本文档主要讲述的是j2m…

    2025年12月6日 软件教程
    100
  • 怎样用免费工具美化PPT_免费美化PPT的实用方法分享

    利用KIMI智能助手可免费将PPT美化为科技感风格,但需核对文字准确性;2. 天工AI擅长优化内容结构,提升逻辑性,适合高质量内容需求;3. SlidesAI支持语音输入与自动排版,操作便捷,利于紧急场景;4. Prezo提供多种模板,自动生成图文并茂幻灯片,适合学生与初创团队。 如果您有一份内容完…

    2025年12月6日 软件教程
    000
  • jm漫画官方正版入口 jm漫画官方网站登录链接

    JM漫画作为一个致力于为广大漫画爱好者服务的全方位的数字漫画阅读平台,凭借其海量的资源储备、卓越的阅读体验和人性化的功能设计,在众多同类平台中脱颖而出。它不仅收录了来自世界各地的热门连载与经典完结作品,更通过智能推荐算法,精准地将符合用户口味的精彩内容呈现眼前,让每一位用户都能在这里找到属于自己的精…

    2025年12月6日 软件教程
    000
  • 怎么下载安装快手极速版_快手极速版下载安装详细教程

    1、优先通过华为应用市场搜索“快手极速版”,确认开发者为北京快手科技有限公司后安装;2、若应用商店无结果,可访问快手极速版官网下载APK文件,需手动开启浏览器的未知来源安装权限;3、也可选择豌豆荚、应用宝等可信第三方平台下载官方版本,核对安全标识后完成安装。 如果您尝试在手机上安装快手极速版,但无法…

    2025年12月6日 软件教程
    000
  • 哔哩哔哩的视频卡在加载中怎么办_哔哩哔哩视频加载卡顿解决方法

    视频加载停滞可先切换网络或重启路由器,再清除B站缓存并重装应用,接着调低播放清晰度并关闭自动选分辨率,随后更改播放策略为AVC编码,最后关闭硬件加速功能以恢复播放。 如果您尝试播放哔哩哔哩的视频,但进度条停滞在加载状态,无法继续播放,这通常是由于网络、应用缓存或播放设置等因素导致。以下是解决此问题的…

    2025年12月6日 软件教程
    000
  • 买家网购苹果手机仅退款不退货遭商家维权,法官调解后支付货款

    10 月 24 日消息,据央视网报道,近年来,“仅退款”服务逐渐成为众多网购平台的常规配置,但部分消费者却将其当作“免费试用”的手段,滥用规则谋取私利。 江苏扬州市民李某在某电商平台购买了一部苹果手机,第二天便以“不想要”为由在线申请“仅退款”,当时手机尚在物流运输途中。第三天货物送达后,李某签收了…

    2025年12月6日 行业动态
    000
  • Linux中如何安装Nginx服务_Linux安装Nginx服务的完整指南

    首先更新系统软件包,然后通过对应包管理器安装Nginx,启动并启用服务,开放防火墙端口,最后验证欢迎页显示以确认安装成功。 在Linux系统中安装Nginx服务是搭建Web服务器的第一步。Nginx以高性能、低资源消耗和良好的并发处理能力著称,广泛用于静态内容服务、反向代理和负载均衡。以下是在主流L…

    2025年12月6日 运维
    000
  • 当贝X5S怎样看3D

    当贝X5S观看3D影片无立体效果时,需开启3D模式并匹配格式:1. 播放3D影片时按遥控器侧边键,进入快捷设置选择3D模式;2. 根据片源类型选左右或上下3D格式;3. 可通过首页下拉进入电影专区选择3D内容播放;4. 确认片源为Side by Side或Top and Bottom格式,并使用兼容…

    2025年12月6日 软件教程
    100
  • Linux journalctl与systemctl status结合分析

    先看 systemctl status 确认服务状态,再用 journalctl 查看详细日志。例如 nginx 启动失败时,systemctl status 显示 Active: failed,journalctl -u nginx 发现端口 80 被占用,结合两者可快速定位问题根源。 在 Lin…

    2025年12月6日 运维
    100
  • TikTok视频无法下载怎么办 TikTok视频下载异常修复方法

    先检查链接格式、网络设置及工具版本。复制以https://www.tiktok.com/@或vm.tiktok.com开头的链接,删除?后参数,尝试短链接;确保网络畅通,可切换地区节点或关闭防火墙;更新工具至最新版,优先选用yt-dlp等持续维护的工具。 遇到TikTok视频下载不了的情况,别急着换…

    2025年12月6日 软件教程
    100
  • Linux如何防止缓冲区溢出_Linux防止缓冲区溢出的安全措施

    缓冲区溢出可通过栈保护、ASLR、NX bit、安全编译选项和良好编码实践来防范。1. 使用-fstack-protector-strong插入canary检测栈破坏;2. 启用ASLR(kernel.randomize_va_space=2)随机化内存布局;3. 利用NX bit标记不可执行内存页…

    2025年12月6日 运维
    000
  • 2025年双十一买手机选直板机还是选折叠屏?建议看完这篇再做决定

    随着2025年双十一购物节的临近,许多消费者在选购智能手机时都会面临一个共同的问题:是选择传统的直板手机,还是尝试更具科技感的折叠屏设备?其实,这个问题的答案早已在智能手机行业的演进中悄然浮现——如今的手机市场已不再局限于“拼参数、堆配置”的初级竞争,而是迈入了以形态革新驱动用户体验升级的新时代。而…

    2025年12月6日 行业动态
    000
  • Pboot插件数据库连接的配置教程_Pboot插件数据库备份的自动化脚本

    首先配置PbootCMS数据库连接参数,确保插件正常访问;接着创建auto_backup.php脚本实现备份功能;然后通过Windows任务计划程序或Linux Cron定时执行该脚本,完成自动化备份流程。 如果您正在开发或维护一个基于PbootCMS的网站,并希望实现插件对数据库的连接配置以及自动…

    2025年12月6日 软件教程
    000
  • jm漫画网页网址 jm漫画网页版进入 jm漫画网站网页版

    在广阔的数字漫画世界中,无数爱好者渴望寻得一个能够汇集海量作品、提供流畅阅读体验的综合性平台。这样的平台不仅是追更新、补旧番的乐园,更是连接创作者与读者的桥梁,让每一个精彩的故事都能被发现和分享。它以其丰富的资源和人性化的设计,成为了漫画迷们探索奇妙二次元世界的理想起点,满足了从热门大作到小众佳作的…

    2025年12月6日 软件教程
    000
  • 今日头条官方主页入口 今日头条平台直达网址官方链接

    今日头条官方主页入口是www.toutiao.com,该平台通过个性化信息流推送图文、短视频等内容,具备分类导航、便捷搜索及跨设备同步功能。 今日头条官方主页入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来今日头条平台直达网址官方链接,感兴趣的网友一起随小编来瞧瞧吧! www.tout…

    2025年12月6日 软件教程
    000

发表回复

登录后才能评论
关注微信