JerryThePineapple
JerryThePineapple

Reputation: 71

testing whether property exists on an object and is equal to a certain value

let's say that we have an javascript object like below:

let obj = {name: 'firstName'};

which is a better way to test whether a property exists on an object and is equal to something:

1)

if (obj.address === 'someAddress')

or

2)

if (!!obj.address && obj.address === 'someAddress')

Can someone explain which is better/safer and why?

Upvotes: 1

Views: 1984

Answers (3)

Thomas
Thomas

Reputation: 181715

You asked "safer" and "better". "Better" is subjective as long as you don't define what qualities you're looking for, so I'll ignore that part.

Accessing a property that doesn't exist is valid in JavaScript, and simply returns undefined. So the second way is equivalent to:

const address = obj.address
if (!!address && address === 'someAddress') {
    ...
}

Now you can see that that's plain silly, because the second condition implies the first. In other words, there is no way that address === 'someAddress' can be true and !!address can be false, so there is no need to do the first check at all.

So the second approach is not safer than the first. Both have the same observable effect.


Nitpicker's corner: if you were checking for some falsy value like 0 or "" instead of the truthy string 'someAddress', then the second approach would not even work, because both conditions can never be true at the same time.

Also, if address is a property with an evil getter that may return a different value each time it's called, all bets are off. The first version could actually be safer because it only gets the value once, but presumably the value would be used inside the if block so the code is still broken.

Upvotes: 3

Vasile Radeanu
Vasile Radeanu

Reputation: 906

Better is:

if (obj?.address === 'someAddress')

it checks both conditions

Upvotes: -1

iamlk
iamlk

Reputation: 74

1 is shorter :D and it works :D

Upvotes: 1

Related Questions