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 March 2022.
Phương thức tĩnh Object.hasOwn() trả về true nếu đối tượng được chỉ định có thuộc tính được chỉ định là thuộc tính riêng của nó. Nếu thuộc tính được kế thừa, hoặc không tồn tại, phương thức trả về false.
Note:
Object.hasOwn() được dự định là sự thay thế cho Object.prototype.hasOwnProperty().
Try it
const object = {
prop: "exists",
};
console.log(Object.hasOwn(object, "prop"));
// Expected output: true
console.log(Object.hasOwn(object, "toString"));
// Expected output: false
console.log(Object.hasOwn(object, "undeclaredPropertyValue"));
// Expected output: false
Cú pháp
Object.hasOwn(obj, prop)
Tham số
Giá trị trả về
true nếu đối tượng được chỉ định đã định nghĩa trực tiếp thuộc tính được chỉ định. Nếu không thì false.
Mô tả
Phương thức Object.hasOwn() trả về true nếu thuộc tính được chỉ định là thuộc tính trực tiếp của đối tượng — ngay cả khi giá trị thuộc tính là null hoặc undefined. Phương thức trả về false nếu thuộc tính được kế thừa, hoặc chưa được khai báo. Không giống toán tử in, phương thức này không kiểm tra thuộc tính được chỉ định trong chuỗi prototype của đối tượng.
Nó được khuyến nghị thay cho Object.prototype.hasOwnProperty() vì nó hoạt động với các đối tượng null-prototype và với các đối tượng đã ghi đè phương thức hasOwnProperty() kế thừa. Mặc dù có thể giải quyết các vấn đề này bằng cách truy cập Object.prototype.hasOwnProperty() trên một đối tượng khác (như Object.prototype.hasOwnProperty.call(obj, prop)), Object.hasOwn() trực quan và súc tích hơn.
Ví dụ
>Sử dụng Object.hasOwn() để kiểm tra sự tồn tại của thuộc tính
Đoạn code sau cho thấy cách xác định xem đối tượng example có chứa thuộc tính có tên prop hay không.
const example = {};
Object.hasOwn(example, "prop"); // false - 'prop' chưa được định nghĩa
example.prop = "exists";
Object.hasOwn(example, "prop"); // true - 'prop' đã được định nghĩa
example.prop = null;
Object.hasOwn(example, "prop"); // true - thuộc tính riêng tồn tại với giá trị là null
example.prop = undefined;
Object.hasOwn(example, "prop"); // true - thuộc tính riêng tồn tại với giá trị là undefined
Thuộc tính trực tiếp và kế thừa
Ví dụ sau phân biệt giữa thuộc tính trực tiếp và thuộc tính được kế thừa qua chuỗi prototype:
const example = {};
example.prop = "exists";
// `hasOwn` chỉ trả về true cho thuộc tính trực tiếp:
Object.hasOwn(example, "prop"); // true
Object.hasOwn(example, "toString"); // false
Object.hasOwn(example, "hasOwnProperty"); // false
// Toán tử `in` sẽ trả về true cho thuộc tính trực tiếp hoặc kế thừa:
"prop" in example; // true
"toString" in example; // true
"hasOwnProperty" in example; // true
Lặp qua các thuộc tính của một đối tượng
Để lặp qua các thuộc tính có thể đếm của đối tượng, bạn nên sử dụng:
const example = { foo: true, bar: true };
for (const name of Object.keys(example)) {
// …
}
Nhưng nếu bạn cần sử dụng for...in, bạn có thể sử dụng Object.hasOwn() để bỏ qua các thuộc tính kế thừa:
const example = { foo: true, bar: true };
for (const name in example) {
if (Object.hasOwn(example, name)) {
// …
}
}
Kiểm tra xem chỉ số mảng có tồn tại hay không
Các phần tử của Array được định nghĩa là thuộc tính trực tiếp, vì vậy bạn có thể sử dụng phương thức hasOwn() để kiểm tra xem một chỉ số cụ thể có tồn tại hay không:
const fruits = ["Apple", "Banana", "Watermelon", "Orange"];
Object.hasOwn(fruits, 3); // true ('Orange')
Object.hasOwn(fruits, 4); // false - không được định nghĩa
Các trường hợp có vấn đề với hasOwnProperty()
Phần này chứng minh rằng Object.hasOwn() miễn nhiễm với các vấn đề ảnh hưởng đến hasOwnProperty(). Đầu tiên, nó có thể được sử dụng với các đối tượng đã triển khai lại hasOwnProperty(). Trong ví dụ dưới đây, phương thức hasOwnProperty() được triển khai lại báo cáo false cho mọi thuộc tính, nhưng hành vi của Object.hasOwn() vẫn không bị ảnh hưởng:
const foo = {
hasOwnProperty() {
return false;
},
bar: "The dragons be out of office",
};
console.log(foo.hasOwnProperty("bar")); // false
console.log(Object.hasOwn(foo, "bar")); // true
Nó cũng có thể được sử dụng với các đối tượng null-prototype. Các đối tượng này không kế thừa từ Object.prototype, vì vậy hasOwnProperty() không thể truy cập.
const foo = Object.create(null);
foo.prop = "exists";
console.log(foo.hasOwnProperty("prop"));
// Uncaught TypeError: foo.hasOwnProperty is not a function
console.log(Object.hasOwn(foo, "prop")); // true
Đặc tả
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-object.hasown> |