ECMAScript 2017 中的 Object.is 与 === 的区别

ECMAScript 2017 中的 Object.is 与 === 的区别

在 JavaScript 中,判断两个值是否相等是常常需要解决的问题。而在 ECMAScript 2017 中,新引入了一个方法 Object.is() 来进行值的比较,那么它与原生的 === 操作符有什么区别呢?

=== 是严格相等运算符,用来判断两个值是否完全相等,即类型和值都相等,比较结果是布尔值 true 或 false。而 Object.is() 则是基于 SameValue 原则进行比较,用来判断两个值是否相等,比较结果是布尔值 true 或 false。

但是,SameValue 原则与严格相等运算符的行为类似,但存在一些细微的差别。下面来看一下 Object.is() 和 === 在比较不同类型的值时的行为:

  1. 比较数字
------------ --- -- ----
-------------- ----- -- ----
------------ ---- -- -----

- --- -- -- ----
--- --- ---- -- -----
- --- --- -- ----

可以看到,Object.is() 在比较 NaN 和 NaN 时返回 true,而 === 返回 false;在比较 0 和 -0 时,Object.is() 返回 false,而 === 返回 true。

这是因为,NaN 在 JavaScript 中被认为不等于任何值,包括它本身。而对于正负 0 来说,它们在数值上是相等的,但有着不同的符号,而 Object.is() 会将它们视为不相等的值。

  1. 比较字符串
---------------- ------- -- ----

----- --- ------ -- ----

无论是 Object.is() 还是 ===,它们在比较字符串时都只考虑值相等,不会考虑大小写或位置。

  1. 比较布尔值
--------------- ------ -- ----
---------------- ------- -- ----

---- --- ----- -- ----
----- --- ------ -- ----

在比较布尔值时,Object.is() 和 === 的行为是一致的,都只考虑值相等。

  1. 比较对象
----- ---- - - ---- ----- --
----- ---- - - ---- ----- --

--------------- ------ -- ----
--------------- ------ -- -----

---- --- ----- -- ----
---- --- ----- -- -----

在比较对象时,Object.is() 和 === 会比较它们在内存中所处的位置,而不是它们的属性是否完全相等。只有当两个对象的引用指向同一个位置时,Object.is() 才会返回 true,而 === 也是如此。

结论

通过以上分析可以看出,Object.is() 和 === 在很多情况下的行为类似,但在比较 NaN 和正负 0 时会有所不同。另外,Object.is() 比较对象时不考虑属性是否相等,而是比较它们在内存中的位置。

因此,在比较两个值时,要根据具体的情况选择使用 === 还是 Object.is()。如果需要比较所有类型的值,包括 NaN 和正负 0,可以使用 Object.is(),否则建议还是使用 === 进行比较。

示例代码

----- ---- - - ---- ----- --
----- ---- - - ---- ----- --
----- ---- - --- -- ---
----- ---- - --- -- ---

------------------------ ---- -- ----
-------------------------- ------ -- ----
------------------------ ----- -- -----
---------------------------- -------- -- ----
--------------------------- ------- -- ----
---------------------------- -------- -- ----
--------------------------- ------- -- ----
--------------------------- ------- -- -----
--------------------------- ------- -- ----
--------------------------- ------- -- -----

------------- --- --- -- ----
--------------- --- ----- -- -----
------------- --- ---- -- ----
----------------- --- ------- -- ----
---------------- --- ------ -- ----
----------------- --- ------- -- ----
---------------- --- ------ -- ----
---------------- --- ------ -- -----
---------------- --- ------ -- ----
---------------- --- ------ -- -----

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/670ce9d75f551281025c0013


猜你喜欢

  • Tailwind CSS 快速入门

    什么是 Tailwind CSS Tailwind CSS 是一个了不起的 CSS 工具箱,它使用一组可重复使用的现成类来快速构建现代 web 界面,同时提供了大量的定制化选项以满足个性化需求。

    8 天前
  • 如何通过 RESTful API 实现用户注册与登录

    在现代的 Web 应用程序中,用户身份认证及授权是非常重要的功能。RESTful API 是一种用于设计 Web 服务的架构风格,用于创建和消费网络服务。本文将详细讨论如何使用 RESTful API...

    8 天前
  • 如何使用 Cypress 进行可访问性测试

    随着移动设备和智能家居的普及,我们越来越依赖于互联网。但是,我们必须确保这些产品和服务对所有访问者都可用,不管他们是否有视觉或听觉障碍。这就是可访问性测试的重要性所在。

    8 天前
  • SSE与Websocket的性能和优化分析

    介绍 SSE(Server-Sent Events)和Websocket是两种实现服务器与客户端实时通讯的技术。SSE使用HTTP协议,而Websocket则是一种自定义协议。

    8 天前
  • ECMAScript 2017 中的 Object.getOwnPropertyDescriptors 方法解决对象属性描述符的问题

    在前端开发中,经常需要对对象的属性进行定义和操作,包括属性的访问状态、读写状态、枚举性等等。对象属性描述符就是用来定义这些属性的详细信息的方法,而在 ECMAScript 2017 中,加入了一个新的...

    8 天前
  • Awesome-Serverless-ZH:无服务器架构资源地图

    无服务器架构是一种全新的经典架构,它会帮助您解决场景特定的问题,可以减少您需要管理的基础设施数量和服务的复杂性,并为您节省运维成本。随着人们在Java、Python、C#等各种语言中将无服务器功能添加...

    8 天前
  • 在使用 Custom Elements 时遇到的性能问题及解决方案

    在使用 Custom Elements 时遇到的性能问题及解决方案 Custom Elements 是 Web Components 的一部分,允许你定义自己的 HTML 标签(也称为“自定义元素”)...

    8 天前
  • Redis 使用教程:如何备份 Redis 数据

    在前端开发中,Redis 是一个非常常见的数据缓存工具。但是,由于各种原因,我们可能需要对 Redis 数据进行备份,以免数据丢失或损坏。本文将详细介绍如何备份 Redis 数据,并提供相应的示例代码...

    8 天前
  • 如何使用 Web Components 实现动态加载路由

    Web Components 是 Web 开发的一项重要技术,它可以让我们更好地实现组件式开发和模块化开发。在前端开发中,常常需要实现动态加载路由,以便在应用程序中实现更好的用户体验。

    8 天前
  • RESTful API 中的资源关系处理方法

    RESTful API 是一种基于 HTTP 协议的 API 设计风格,它强调以资源为中心,通过一组简洁明了的标准操作和约束来实现对资源的访问和操作。在这种架构下,资源之间的关系处理是一个重要而复杂的...

    8 天前
  • 如何在 Babel 中使用 typescript 插件

    简介 Babel 是一个广泛使用的 JavaScript 编译器,它可以将 ES6+ 代码转化为可在老版本浏览器上运行的 ES5 代码。但是,Babel 默认不支持 TypeScript 语法,所以我...

    8 天前
  • 如何在 ECMAScript 2017 中使用 Object.fromEntries 方法

    介绍 ES2017(也称为ES8)是ECMAScript标准的最新版本,其中包含了许多新的功能和特性。其中一个非常有用的新功能是Object.fromEntries()方法。

    8 天前
  • TypeScript 中的闭包问题解析

    在 TypeScript 中,闭包被广泛地使用,在前端开发中扮演了重要的角色。但是,在使用闭包的过程中,我们可能会遇到一些问题,从而影响程序的正常运行。本文将探讨 TypeScript 中的闭包问题,...

    8 天前
  • ECMAScript 2019中的Promise.race方法

    在现代Web开发中,异步操作已经成为了一个非常重要的话题。在JavaScript中,Promise是一种可靠的方式来处理异步操作。它提供了一种简单的方式来组合异步操作,使得代码更易于理解和维护。

    8 天前
  • ES7 中的 Array.prototype.some() 方法:完整指南

    ES7 中的 Array.prototype.some() 方法:完整指南 在编写 JavaScript 代码时,我们会经常涉及到数组处理。数组中有很多方法可以使用,其中之一就是 Array.prot...

    8 天前
  • 在 Fastify 中使用 Node.js Promise API 的最佳实践

    前言 Fastify 是一个现代化的 Web 框架,它被设计成一个快速而且低开销的框架,因此它也广泛应用在了各大 Web 应用中。在实际开发中,我们通常需要使用 Promise API 进行异步编程,...

    8 天前
  • 读 Jsun8584 的 React 入门(4)---Redux 的数据流

    前言 随着网页开发越来越复杂,JavaScript 的单线程、事件循环和全局变量等缺点逐渐被暴露出来。为了解决这些问题,Facebook 推出了 Flux 架构和 Redux 库。

    8 天前
  • 如何使用 ES6 的 Promise 进行链式调用

    引言 在前端开发中,经常会碰到需要执行一系列异步任务的情况,例如在进行HTTP请求时,我们需要先验证用户登录状态,然后将用户信息发送到服务端,处理返回的数据等等。在ES5中,我们通常会使用回调函数来管...

    8 天前
  • 高效的 Performance Optimization:利用 Lighthouse 检测你的 Web 应用程序

    高效的 Performance Optimization:利用 Lighthouse 检测你的 Web 应用程序 对于前端开发者来说,优化网站性能是必不可少的任务之一。

    8 天前
  • Socket.io 怎样处理各种错误和超时?

    Socket.io 是一个用于实现实时、双向、基于事件的通信库,常用于 WebSocket 应用程序。它可以帮助开发者构建出高度交互的应用程序。但是,错误和超时是实时应用的常见问题之一。

    8 天前

相关推荐

    暂无文章