Khác nhau ở phạm vi tìm kiếm: hasOwnProperty chỉ nhìn trên chính object, in đi hết prototype chain.
javascript
const parent = { inherited: 1 }
const obj = Object.create(parent)
obj.own = 2
Object.hasOwn(obj, 'own') // true
Object.hasOwn(obj, 'inherited') // false — nằm trên prototype
'own' in obj // true
'inherited' in obj // true — in đi ngược lên chain
'toString' in obj // true — tới tận Object.prototypeVì sao nên dùng Object.hasOwn thay obj.hasOwnProperty:
javascript
const dict = Object.create(null) // object không có prototype
dict.a = 1
dict.hasOwnProperty('a') // TypeError — không có method này
Object.hasOwn(dict, 'a') // true — vẫn chạy
const evil = { hasOwnProperty: () => false }
evil.hasOwnProperty('hasOwnProperty') // false — bị ghi đè nên trả sai (thật ra có)
Object.hasOwn(evil, 'hasOwnProperty') // true — đúngĐây chính là lý do code cũ hay viết Object.prototype.hasOwnProperty.call(obj, key); Object.hasOwn (ES2022) là bản gọn của đúng cách viết đó.
Chọn thế nào: kiểm tra dữ liệu do người dùng/API đưa vào → Object.hasOwn. Kiểm tra một method hay thuộc tính có dùng được không (kể cả kế thừa) → in.