Take this snippet,
var a = {
}
if(typeof a.c === 'undefined'){
console.log('inside if');
}
if(a.c === undefined){
console.log('inside if');
}
Both if results in true. Is there any difference in both statements specific to some browsers?
Also, in my last project I have already used typeof a.c == 'undefined' numerous times to check values in json data.
Now, I know that this is not good way, as some value may be undefined too, so my logic will fail.
I should have used hasOwnProperty .
But I am sure that no value will be undefined , can I use typeof a.c == 'undefined' in place of hasOwnProperty or should I change all my typeof with hasOwnProperty
The hasOwnProperty() method returns a boolean indicating whether the object has the specified property as its own property (as opposed to inheriting it).
In a JavaScript program, the correct way to check if an object property is undefined is to use the typeof operator. If the value is not defined, typeof returns the 'undefined' string.
A variable that has not been assigned a value is of type undefined . A method or statement also returns undefined if the variable that is being evaluated does not have an assigned value. A function returns undefined if a value was not returned .
The key difference is that in will return true for inherited properties, whereas hasOwnProperty() will return false for inherited properties.
(UPDATE: You might want to check out this question: variable === undefined vs. typeof variable === "undefined").
In very old browsers (Netscape 2, IIRC, and possibly IE 4 or lower), you couldn’t compare a value with undefined, since that caused an error. In any (semi-) modern browser, however, there’s no reason to check typeof value === 'undefined' instead of value === undefined (except for paranoia that somebody might have redefined the variable undefined).
hasOwnProperty serves a different purpose. It checks if the object has a property with the given name, and not its prototype; i.e. regardless of the inherited properties. If you want to check whether an object contains a certain property, inherited or not, you should use if ('c' in a) {...
But basically, these will probably all work:
if (a.c === undefined) console.log('No c in a!');
if (typeof a.c === 'undefined') console.log('No c in a!');
if (!('c' in a)) console.log('No c in a!');
if (!a.hasOwnProperty('c')) console.log('No c in a!');
The main differences being that:
a.c === undefined will produce an unexpected result if someone has done undefined = 'defined' or some such trick;!('c' in a) is not very readable (IMHO)!a.hasOwnProperty('c') will return false if the object a doesn’t contain a property c, but its prototype does.Personally, I prefer the first since it’s more readable. If you’re paranoid and want to avoid the risk of a redefined undefined, wrap your code in a self-executing anonymous function as follows:
(function (undefined) {
// in here, 'undefined' is guaranteed to be undefined. :-)
var a = {
};
})();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With