ES9 是 ECMAScript 的第九个版本,其中引入了一种新的相等运算符——Object.is
。相比于常规的 ==
和 ===
运算符,Object.is
更加严格和精确,避免了一些不必要的隐式类型转换和奇怪的拼凑行为。本文将详细探讨 Object.is
的用法和背后的原理,以及与其他运算符的对比和指导意义。
Object.is
的基本用法
Object.is
是一个静态方法,它接受两个参数,分别是要比较的两个值。它的返回值是一个布尔值,表示两个值是否相等。形式如下:
Object.is(value1, value2);
如果 value1
和 value2
完全相等,包括类型和值都一致,返回 true
;否则返回 false
。这里的完全相等指的是按照 ECMAScript 规范定义的相等(即SameValue
)。
具体来说,Object.is
的规则如下:
- 如果两个值都是
undefined
,返回true
。 - 如果两个值都是
null
,返回true
。 - 如果两个值都是布尔类型,且值相同,返回
true
。 - 如果两个值都是数字类型,且值相同,返回
true
。但是注意,对于特殊的非数字值NaN
,Object.is(NaN, NaN)
返回true
,而==
和===
不是这样的。 - 如果两个值都是字符串类型,且值相同,返回
true
。 - 如果两个值引用同一个对象或函数(即指向同一个内存地址),返回
true
。 - 如果以上条件均不成立,返回
false
。
下面是一些使用 Object.is
的例子:
-- -------------------- ---- ------- ------------ --- -- ---- ------------ ----- -- ----- ------------ ---- -- ----- -------------- ----- -- ---- --------------- ------ -- ---- ------------- ---- -- ----- ----- ---- - --- ----- ---- - ----- --------------- ------ -- ----
需要注意的是,Object.is
不具有类型转换的能力。它只能比较相同类型的值。如果两个值的类型不同,它们是不可能相等的。这一点与 ==
和 ===
的行为不同,它们会进行隐式类型转换再进行比较。例如,"1" == 1
和 1 === "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