Movatterモバイル変換


[0]ホーム

URL:


  1. 面向开发者的 Web 技术
  2. JavaScript
  3. JavaScript 参考
  4. JavaScript 标准内置对象
  5. Object
  6. Object.hasOwn()

此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in EnglishAlways switch to English

Object.hasOwn()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨2022年3月⁩.

如果指定的对象自身有指定的属性,则静态方法Object.hasOwn() 返回true。如果属性是继承的或者不存在,该方法返回false

备注:Object.hasOwn() 旨在取代Object.prototype.hasOwnProperty()

尝试一下

const object1 = {  prop: "exists",};console.log(Object.hasOwn(object1, "prop"));// Expected output: trueconsole.log(Object.hasOwn(object1, "toString"));// Expected output: falseconsole.log(Object.hasOwn(object1, "undeclaredPropertyValue"));// Expected output: false

语法

js
Object.hasOwn(obj, prop)

参数

obj

要测试的 JavaScript 实例对象。

prop

要测试属性的String 类型的名称或者Symbol

返回值

如果指定的对象中直接定义了指定的属性,则返回true;否则返回false

描述

如果指定的属性是该对象的直接属性——Object.hasOwn() 方法返回true,即使属性值是nullundefined。如果属性是继承的或者不存在,该方法返回false。它不像in 运算符,这个方法不检查对象的原型链中的指定属性。

建议使用此方法替代Object.prototype.hasOwnProperty(),因为它适用于使用Object.create(null) 创建的对象,以及重写了继承的hasOwnProperty() 方法的对象。尽管可以通过在外部对象上调用Object.prototype.hasOwnProperty() 解决这些问题,但是Object.hasOwn() 更加直观。

示例

使用 hasOwn 去测试属性是否存在

以下代码展示了如何确定example 对象中是否包含名为prop 的属性。

js
const example = {};Object.hasOwn(example, "prop"); // false——目标对象的属性 'prop' 未被定义example.prop = "exists";Object.hasOwn(example, "prop"); // true——目标对象的属性 'prop' 已被定义example.prop = null;Object.hasOwn(example, "prop"); // true——目标对象本身的属性存在,值为 nullexample.prop = undefined;Object.hasOwn(example, "prop"); // true——目标对象本身的属性存在,值为 undefined

直接属性和继承属性

以下示例区分了直接属性和通过原型链继承的属性:

js
const example = {};example.prop = "exists";// `hasOwn` 静态方法只会对目标对象的直接属性返回 true:Object.hasOwn(example, "prop"); // 返回 trueObject.hasOwn(example, "toString"); // 返回 falseObject.hasOwn(example, "hasOwnProperty"); // 返回 false// `in` 运算符对目标对象的直接属性或继承属性均会返回 true:"prop" in example; // 返回 true"toString" in example; // 返回 true"hasOwnProperty" in example; // 返回 true

迭代对象的属性

要迭代对象的可枚举属性,你应该这样使用:

js
const example = { foo: true, bar: true };for (const name of Object.keys(example)) {  // …}

但是如果你使用for...in,你应该使用Object.hasOwn() 跳过继承属性:

js
const example = { foo: true, bar: true };for (const name in example) {  if (Object.hasOwn(example, name)) {    // …  }}

检查数组索引是否存在

Array 中的元素被定义为直接属性,所以你可以使用hasOwn() 方法去检查一个指定的索引是否存在:

js
const fruits = ["Apple", "Banana", "Watermelon", "Orange"];Object.hasOwn(fruits, 3); // true ('Orange')Object.hasOwn(fruits, 4); // false——没有定义的

hasOwnProperty 的问题案例

本部分证明了影响hasOwnProperty 的问题对hasOwn() 是免疫的。首先,它可以与重新实现的hasOwnProperty() 一起使用:

js
const foo = {  hasOwnProperty() {    return false;  },  bar: "The dragons be out of office",};if (Object.hasOwn(foo, "bar")) {  console.log(foo.bar); //true——重新实现 hasOwnProperty() 不会影响 Object}

它也可以用于测试使用Object.create(null) 创建的对象。这些对象不会继承自Object.prototype,因此hasOwnProperty() 方法是无法访问的。

js
const foo = Object.create(null);foo.prop = "exists";if (Object.hasOwn(foo, "prop")) {  console.log(foo.prop); //true——无论对象是如何创建的,它都可以运行。}

规范

Specification
ECMAScript® 2026 Language Specification
# sec-object.hasown

浏览器兼容性

参见

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp