Object.prototype.hasOwnProperty()

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

hasOwnProperty() 方法是 Object 例項的一個方法,它返回一個布林值,指示該物件是否具有指定的屬性作為其自身屬性(而不是繼承的屬性)。

注意: 在支援 Object.hasOwn() 的瀏覽器中,推薦使用它而不是 hasOwnProperty()

試一試

const object = {};
object.foo = 42;

console.log(object.hasOwnProperty("foo"));
// Expected output: true

console.log(object.hasOwnProperty("toString"));
// Expected output: false

console.log(object.hasOwnProperty("hasOwnProperty"));
// Expected output: false

語法

js
hasOwnProperty(prop)

引數

prop

要測試的屬性的 String 名稱或 Symbol

返回值

如果物件具有指定的屬性作為自身屬性,則返回 true;否則返回 false

描述

hasOwnProperty() 方法返回 true,如果指定的屬性是物件的直接屬性——即使其值為 nullundefined。如果屬性是繼承的,或者根本沒有宣告,該方法返回 false。與 in 運算子不同,此方法不會檢查物件原型鏈中的指定屬性。

該方法可以應用於大多數 JavaScript 物件,因為大多數物件都繼承自 Object,因此繼承了它的方法。例如,Array 是一個 Object,因此您可以使用 hasOwnProperty() 方法來檢查索引是否存在。

js
const fruits = ["Apple", "Banana", "Watermelon", "Orange"];
fruits.hasOwnProperty(3); // true ('Orange')
fruits.hasOwnProperty(4); // false - not defined

如果物件重寫了該方法,或者該物件是沒有原型的物件(因為它們不繼承自 Object.prototype),則該方法將不可用。下面將給出這些情況的示例。

示例

使用 hasOwnProperty 測試自身屬性是否存在

以下程式碼展示瞭如何確定 example 物件是否包含名為 prop 的屬性。

js
const example = {};
example.hasOwnProperty("prop"); // false

example.prop = "exists";
example.hasOwnProperty("prop"); // true - 'prop' has been defined

example.prop = null;
example.hasOwnProperty("prop"); // true - own property exists with value of null

example.prop = undefined;
example.hasOwnProperty("prop"); // true - own property exists with value of undefined

直接屬性與繼承屬性

以下示例區分了直接屬性和透過原型鏈繼承的屬性。

js
const example = {};
example.prop = "exists";

// `hasOwnProperty` will only return true for direct properties:
example.hasOwnProperty("prop"); // true
example.hasOwnProperty("toString"); // false
example.hasOwnProperty("hasOwnProperty"); // false

// The `in` operator will return true for direct or inherited properties:
"prop" in example; // true
"toString" in example; // true
"hasOwnProperty" in example; // true

遍歷物件的屬性

以下示例展示瞭如何遍歷物件的列舉屬性而不執行繼承的屬性。

js
const buz = {
  fog: "stack",
};

for (const name in buz) {
  if (buz.hasOwnProperty(name)) {
    console.log(`this is fog (${name}) for sure. Value: ${buz[name]}`);
  } else {
    console.log(name); // toString or something else
  }
}

請注意,for...in 迴圈只遍歷可列舉項:迴圈未發出非可列舉屬性並不意味著 hasOwnProperty 本身嚴格限於可列舉項。您可以使用 Object.getOwnPropertyNames() 遍歷非可列舉屬性。

將 hasOwnProperty 用作屬性名

JavaScript 不會保護 hasOwnProperty 這個屬性名;具有此名稱屬性的物件可能會返回錯誤的結果。

js
const foo = {
  hasOwnProperty() {
    return false;
  },
  bar: "Here be dragons",
};

foo.hasOwnProperty("bar"); // re-implementation always returns false

解決此問題的推薦方法是使用 Object.hasOwn()(在支援它的瀏覽器中)。其他替代方法包括使用外部hasOwnProperty

js
const foo = { bar: "Here be dragons" };

// Use Object.hasOwn() method - recommended
Object.hasOwn(foo, "bar"); // true

// Use the hasOwnProperty property from the Object prototype
Object.prototype.hasOwnProperty.call(foo, "bar"); // true

// Use another Object's hasOwnProperty
// and call it with 'this' set to foo
({}).hasOwnProperty.call(foo, "bar"); // true

請注意,在前兩種情況下沒有新建立的物件。

使用 Object.create(null) 建立的物件

沒有原型的物件不繼承自 Object.prototype,這使得 hasOwnProperty() 不可用。

js
const foo = Object.create(null);
foo.prop = "exists";
foo.hasOwnProperty("prop"); // Uncaught TypeError: foo.hasOwnProperty is not a function

在這種情況下,解決方案與上一節相同:優先使用 Object.hasOwn(),否則使用外部物件的 hasOwnProperty()

規範

規範
ECMAScript® 2026 語言規範
# sec-object.prototype.hasownproperty

瀏覽器相容性

另見