How to Check if a JavaScript Variable is Undefined
In JavaScript, checking if a variable is undefined can be a bit tricky since
a null variable can pass a check for undefined if not written properly.
As a result, this allows for undefined values to slip through and vice versa. Make sure you use strict equality === to check if a value is
equal to undefined.
let x;
const y = null;
x == null && y == undefined; // true
x === null || y === undefined; // false
x == null && typeof x == 'object'; // false
x === undefined && typeof x == 'undefined'; // true
Another alternative is checking if typeof x === 'undefined'. The
biggest difference between these two approaches is that, if x has not been declared, x === undefined throws
a ReferenceError, but typeof does not.
When using x === undefined, JavaScript checks if x is a declared variable
that is strictly equal to undefined. If you want to check if x is
strictly equal to undefined regardless of whether is has been declared
or not, you should use typeof x === 'undefined'.
x === undefined; // Throws a ReferenceError
typeof x == 'undefined'; // true
However, typeof x may still throw an error if you later declare x using let or const:
typeof x; // Throws "ReferenceError: Cannot access 'x' before initialization" because of `let`
let x = 42;
Checking Whether Object Properties are Undefined
Checking whether an object property is undefined is subtle, because if you access
a property that doesn't exist in the object, JavaScript will report the property's value as undefined
rather than throw a ReferenceError.
const obj = { answer: 42, question: undefined };
obj.answer; // 42
obj.question; // undefined
obj.notInObject; // undefined
In JavaScript obj.propName === undefined is true if either obj has a property 'propName' and the property's
value is trictly equal undefined, or if obj does not have a property 'propName'. If you want to check whether
obj has a property and that property is strictly equal to undefined, you should use the in operator.
const obj = { answer: 42, question: undefined };
('question' in obj && obj.question === undefined); // true
('notInObject' in obj && obj.notInObj === undefined); // false