ES9 中如何使用相等运算符 Object.is

阅读时长 4 分钟读完

ES9 是 ECMAScript 的第九个版本,其中引入了一种新的相等运算符——Object.is。相比于常规的 ===== 运算符,Object.is 更加严格和精确,避免了一些不必要的隐式类型转换和奇怪的拼凑行为。本文将详细探讨 Object.is 的用法和背后的原理,以及与其他运算符的对比和指导意义。

Object.is 的基本用法

Object.is 是一个静态方法,它接受两个参数,分别是要比较的两个值。它的返回值是一个布尔值,表示两个值是否相等。形式如下:

如果 value1value2 完全相等,包括类型和值都一致,返回 true;否则返回 false。这里的完全相等指的是按照 ECMAScript 规范定义的相等(即SameValue)。

具体来说,Object.is 的规则如下:

  • 如果两个值都是 undefined,返回 true
  • 如果两个值都是 null,返回 true
  • 如果两个值都是布尔类型,且值相同,返回 true
  • 如果两个值都是数字类型,且值相同,返回 true。但是注意,对于特殊的非数字值 NaNObject.is(NaN, NaN) 返回 true,而 ===== 不是这样的。
  • 如果两个值都是字符串类型,且值相同,返回 true
  • 如果两个值引用同一个对象或函数(即指向同一个内存地址),返回 true
  • 如果以上条件均不成立,返回 false

下面是一些使用 Object.is 的例子:

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

需要注意的是,Object.is 不具有类型转换的能力。它只能比较相同类型的值。如果两个值的类型不同,它们是不可能相等的。这一点与 ===== 的行为不同,它们会进行隐式类型转换再进行比较。例如,"1" == 11 === "1" 都返回 true,这是因为 == 会将两个操作数转换为数字类型,而 === 也会将两个操作数转换为相同的类型进行比较。但是 Object.is("1", 1) 返回 false,因为它们的类型不同。

Object.is 的原理和实现

Object.is 的实现非常简单,可以用一个三目运算符来表示:

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

需要注意的是,Object.is 并不比其他运算符更快或更慢。实际上,由于它避免了类型转换,有时候比 ===== 更快。但是在大多数情况下,它们的差别并不明显。

Object.is 的指导意义

对于前端开发者而言,在实际项目中使用 Object.is 的机会并不多。它主要用于 JavaScript 引擎的测试和实现,以及一些特殊的场景。但是,掌握 Object.is 运算符的原理和用法,有助于我们更加深入地理解 JavaScript 中的类型和比较,以及避免一些常见的误区和陷阱。除此之外,还有一些类似于 Object.is 的工具和库,比如 Lodash 的 _.isEqual 和 React 的 Object.is。它们在一些自定义类型的比较和对象/数组的深度比较中非常有用。

作为总结,Object.is 是一种更加严格和明确的相等运算符,它避免了一些不必要的隐式类型转换和奇怪的拼凑行为。掌握它的使用方法,可以帮助我们更好地理解 JavaScript 中的类型和比较,以及避免一些常见的误区和陷阱。如果您有相关的使用场景或者补充,欢迎在评论区留言。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6493c93548841e9894164f83

纠错
反馈