callum
callum

Reputation: 37769

Is there an ES6+ alternative to doing Object.prototype.hasOwnProperty.call(obj, key)?

The most bulletproof way of checking if an object has a certain key is:

Object.prototype.hasOwnProperty.call(obj, key)

This provides certain guarantees: it will only evaluate to true if key is a direct property of obj, and it will work even if obj doesn't have the usual Object as its prototype (for example, if it was created with const obj = Object.create(null)).

But it's a mouthful.

Is there any new syntax/method in ES6 or higher (including polyfillable or Babel-compilable 'proposals') that gives the same guarantees, but in a nicer, more readable way?

Upvotes: 28

Views: 26606

Answers (2)

Bergi
Bergi

Reputation: 664620

Update: Object.hasOwn(obj, key) is part of ES2022.


I'm not aware of any syntactical sugar for this. But you shouldn't need to use this very often1, so writing it out occasionally shouldn't be too bad. An equivalent shorter version would be

({}).hasOwnProperty.call(obj, key)

If you really need to use it more often, just define a helper function:

const hasOwn = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key);
const hasOwn = Function.prototype.call.bind(Object.prototype.hasOwnProperty);

1: In most cases, you can omit the check, use in instead, or should be using a Map with its comfortable has method.

Upvotes: 14

Fabiano Taioli
Fabiano Taioli

Reputation: 5540

Object.hasOwn was added to Object standard API. It is now supported on all major browsers.

Upvotes: 5

Related Questions