ES11 中的 Object.hasOwn() 方法

在 JavaScript 中,Object 对象是一个非常常用的对象。在平时的开发中,我们经常需要判断一个对象是否存在某个属性。在 ES5 中,我们通常使用 hasOwnProperty() 方法来判断一个对象是否存在某个属性。但是,hasOwnProperty() 方法并不是一个完美的方法,它有一些缺点。为了解决这些缺点,ES11 中新增了 Object.hasOwn() 方法。

hasOwnProperty() 方法的缺点

hasOwnProperty() 方法用于判断一个对象是否存在某个属性,它的用法如下:

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

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

hasOwnProperty() 方法返回一个布尔值,表示该对象是否包含指定的属性。但是,hasOwnProperty() 方法有一些缺点。

1. 原型链上的属性也会被判断为 true

在 JavaScript 中,对象可以通过原型链继承属性。如果一个对象的原型链上存在某个属性,那么 hasOwnProperty() 方法也会返回 true。例如:

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

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

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

在上面的例子中,newObj 对象通过 Object.create() 方法继承了 obj 对象的属性。虽然 newObj 对象并没有自己的 name 和 age 属性,但是通过原型链,它可以访问到 obj 对象的 name 和 age 属性。因此,hasOwnProperty() 方法会返回 false。

2. 无法判断 Symbol 类型的属性

在 JavaScript 中,Symbol 类型是一种特殊的数据类型,它的值是唯一的。我们可以使用 Symbol() 函数创建一个 Symbol 类型的值,并将其作为对象的属性名。例如:

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

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

在上面的例子中,obj 对象的 name 属性是一个 Symbol 类型的值。虽然该属性存在于 obj 对象中,但是 hasOwnProperty() 方法却无法判断它的存在。

Object.hasOwn() 方法的优点

为了解决 hasOwnProperty() 方法的缺点,ES11 中新增了 Object.hasOwn() 方法。该方法的用法与 hasOwnProperty() 方法相同,但是它可以正确地判断对象的属性是否存在,包括原型链上的属性和 Symbol 类型的属性。例如:

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

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

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

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

在上面的例子中,Object.hasOwn() 方法可以正确地判断 newObj 对象的属性是否存在,包括原型链上的属性和 Symbol 类型的属性。同时,它也可以正确地判断 obj 对象的 Symbol 类型的属性是否存在。

总结

Object.hasOwn() 方法是 ES11 中新增的一个方法,它可以正确地判断对象的属性是否存在,包括原型链上的属性和 Symbol 类型的属性。与 hasOwnProperty() 方法相比,它更加完善和准确。在平时的开发中,我们可以使用 Object.hasOwn() 方法来判断对象的属性是否存在,避免 hasOwnProperty() 方法的缺点。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65e008931886fbafa4d4115a