How can I determine if a variable is 'undefined' or 'null'?
Asked Answered
B

34

2680

How do I determine if a variable is undefined or null?

My code is as follows:

var EmpName = $("div#esd-names div#name").attr('class');
if(EmpName == 'undefined'){
  // DO SOMETHING
};
<div id="esd-names">
  <div id="name"></div>
</div>

But when I do this, the JavaScript interpreter halts execution.

Baneful answered 15/4, 2010 at 18:12 Comment(3)
Possible duplicate of How do you check for an empty string in JavaScript?Idocrase
Use the inbuilt Nullish coalescing operator (??) Ref; developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Nothing
if(EmpName == 'undefined') will not test if EmpName is undefined, it will test the string "undefined", so get rid of those single quotes: if(EmpName == undefined) // because 'undefined'without the quotes is... undefined or the simpler if(!EmpName){ // DO SOMETHING };Arizona
I
3537

You can use the qualities of the abstract equality operator to do this:

if (variable == null){
    // your code here.
}

Because null == undefined is true, the above code will catch both null and undefined.

Ioab answered 15/4, 2010 at 18:14 Comment(14)
I'm trying to test if event is null in firefox and an error blocks the execution: "event is undefined"Affirmative
Can you share the section of code that's erroring? Use a pastebin link.Unrelenting
@MichaelFever How does that not work? Copy paste this in your console: const y = undefined; y == null; It should return trueGreyback
const y = undefined; abc == null; Will return an error... It seems undefined is defined as something...Miles
@ChrisStryczynski In example from your comment you declared y constant, but you ware comparing abc (not y). When I tested y via console.log(y == null); on Chrome and Firefox I got true as result. If you got error then maybe you tried to use assignment operator = instead of comparison == which would make sense to return error since const can't be reassigned.Loaiasis
I never suggest to use that kind of comparsion even if it covers two values. Keep using (var === null || var === undefined) instead.Fund
could be tricky: undefined !== null --> true undefined == null --> trueSurplice
live example of relevant comparisons. lgtm.Babylonian
@ZaytsevDmitry why would you expect a test if a variable is null or undefined to pass if the variable equals 0? The question is not about testing for a truthy value, but rather, testing explicitly for null or undefined.Tundra
eslint enforces a rule disallowing this comparison eslint.org/docs/rules/no-eq-nullWildfowl
The above code by @Ioab throws "Uncaught ReferenceError: variable is not defined" !!! How can such an answer be accepted so widely? Am I the only one in here for whom this simplest of codes doesn't work?Vesuvius
Because everyone understands that this is a comparison for some variable that you already have declared. The word variable is a stand-in for your actual variable. The code shown is a recipe that you adapt to fit your need.Savitt
that doesn't work, let obj = {}; obj.ha === null \\ return falseForegut
@Foregut Understand the answer. obj.ha == null.Monty
U
1378

The standard way to catch null and undefined simultaneously is this:

if (variable == null) {
     // do something 
}

--which is 100% equivalent to the more explicit but less concise:

if (variable === undefined || variable === null) {
     // do something 
}

When writing professional JS, it's taken for granted that type equality and the behavior of == vs === is understood. Therefore we use == and only compare to null.


Edit again

The comments suggesting the use of typeof are simply wrong. Yes, my solution above will cause a ReferenceError if the variable doesn't exist. This is a good thing. This ReferenceError is desirable: it will help you find your mistakes and fix them before you ship your code, just like compiler errors would in other languages. Use try/catch if you are working with input you don't have control over.

You should not have any references to undeclared variables in your code.

Unrelenting answered 22/1, 2014 at 3:1 Comment(27)
This will cause a ReferenceError and break execution if variable is not defined or referred to at all in the code, using typeof is safer.Hendrix
That's more of a stylistic point. If the variable hasn't been declared at all, that's really just bad writing on the part of the author. You should know whether your variable has been declared or not, that shouldn't be a question. But yes, if for some reason that's the case, this should be changed to window.variable instead of just variable, which will not cause a reference error. Typeof should be avoided.Unrelenting
You forgot many use cases. What about data you get from somewhere else such as url query params or json data from some API? What about dynamic structure? You should be able to test if data['token'] is defined? By the way, you mentioned Angular Framework but why would Angular define some angular.isDefined function if it was useless? Your answer is a bit super strict and lack of pragmatism.Serial
You don't need typeof to check data['token'] -- that can be done by if (data.token != null) { /* use data.token */ } . It's not different. You are, however, right about Angular. They have some very specialized methods in there, like isBlankObject and hasCustomToString. Evidently they wanted to cover both the case where the variable was undefined/null as well as undeclared references. While you're correct about their code, for most people this is not what they are looking for, and I stand by my assertion that if you think you need it, you're probably mistaken.Unrelenting
Yes because you wrote !== instead of !=.Unrelenting
imagine i want to check if load_module_1==1 but the load_module_1 can be undefined because depends on loading ajax. How can in check for its value==1 and does not get the undefined error? in a single line of if(!x){return;}Ripplet
@Miguel: Typically, such "possibly declared variables" are globals, i.e. properties of the window object, and the standard solution is to refer to them explicitly as such, e.g. if (! window.load_module_1) return;.Snapdragon
One entirely legitimate use case is in Microsoft Dynamics CRM, where the execution of custom scripts is triggered through front end (UI) configuration and variables are passed (or not passed) from a string that is again defined in an input box in the front end.Boreal
-OP: The statement about those comparisons being "100% equivalent" is SIMPLY WRONG, as you noted in your own EDIT, the second will cause a ReferenceError. As for the assertion: "You should not have any references to undeclared variables in your code." REALLY? Ever heard of Optional Parameters? jsfiddle.net/3xnbxfsuAdverse
@TimothyKanski optional parameters may be undefined if they are optionally not provided, but they are most definitely declared variables. They are declared and have a value of undefined, as any declared but uninitialized variable would, ie var someVar; so your argument doesn't really hold upFontes
@Fontes I gave up on arguing with the people who still comment on this. Once a year or so I ask a mod to clean up comments. There have been so, so many people trying to convince me this is wrong. It never ends.Unrelenting
@Aerovistae word, lol with a language like JS with 8 gazillion people of all coding levels and backgrounds trying to program it I doubt there will be an end to comments supporting bad practice or outright faulty understanding of a concept like an undeclared variable, which would throw a compiler error in other popular statically typed languages but is capable of just being "smoothed over" in a dynamic language like JSFontes
which is just to say, its a common thing for languages with a low cost of entry like javascript and php vs one where you need a more intricate understanding of how a language works before you can really program in it, such as, say, Haskell or ScalaFontes
You say "You should not have any references to undeclared variables in your code" but you forget you need to parse service calls which might, or might not declare properties. Someone needs to know if someRemoteObjectReceived.randomProperty is not received at all, null, undefined, true, "true", "false", false, 1 or 0 depending of a series of uncontrollable events.Goran
And determining that does not require typeof. The answers here can distinguish between undefined and "not received at all," which is certainly impossible with typeof. And to distinguish between the other 8 items you listed, only === would get the job done. I can't even begin to imagine how you arrived at the conclusion that typeof will distinguish between 0 and 1 or true and false but === won't.Unrelenting
@Aerovistae can I use it as - if (variable != null) {} ? will it give the desired result ?Afoot
That conditional would evaluate to true in all cases where the variable is neither null nor undefined, so if that's what you want then yes, it will gives the desired result. You could test that out pretty easily btw :)Unrelenting
Can't you just do if (variable) in Javascript? Also, maybe people mean to reference instanceof instead of typeof -- that is a best practice according to Nicholas Zakas.Botti
@Botti if (variable) tests truthiness. It would count out false, 0, NaN, and an empty string as well as null and undefined, so it is not the correct answer here. As for instanceof, if the questions is "IS THIS VARIABLE NULL OR UNDEFINED?" (perhaps you want the value to be null or undefined...) you cannot ascertain that with instanceof, except by checking that the value isn't an instance of any other type, which is crazy. So that is also the wrong answer here.Unrelenting
its better to put undefine in single qoutes, 'undefined' because it will make it more understandable..Dorran
That's explained in the comments above.Unrelenting
Unless I missed something obvious, having tried this, exactly as written I received "variable is not defined".and the code halted.Augsburg
Then I can infer that you copied and pasted my code exactly. This implies to me that you did not realize that variable was meant to be replaced with the name of your variable. I think it might be for the best for you to read a basic tutorial on JavaScript.Unrelenting
@Unrelenting I feel like your statement 'You should not have any references to undeclared variables in your code' symbolizes the toxicity and the issue of SO which is neglecting various use-case in real life situations. if ( typeof module != 'undefined' && module.exports ) { module.exports = myModule; } else if ( typeof define == 'function' && define.amd ) { define( function () { return myModule; } ); } else { window.myModule= myModule; } If I'm building a library and wanted to support various browsers, I should just give up because you think it's bad?Cuss
SO is to provide references to various users with varying skill level and usecases. It's not your soapbox for asserting which practice is good, if everyone should use functional programming rather than OOP, or whatever. Deadpan stating "X should not be done" is harmful for this community. If you had worded it like "Generally, this would be considered bad practice among others" I would've had no issues.Cuss
@GyuhyeonLee separate browsers should be considered an exception as your code has no influence over what a browser decides to inject. In general, no matter what scripting or coding language you use, it is indeed bad practice to reference undefined variables. JS is just very weird to begin with which doesnt help (for fun, you should watch: youtube.com/watch?v=et8xNAc2ic8)Fieldstone
“This ReferenceError is desirable: it will help you find your mistakes and fix them before you ship your code” Yeah, going to disagree with this one. While it's great to aspire to only use variable that exist, that's not always the reality. Being able to check for undefined/null has legitimate uses, and a multi-line solution with try/catch is not a good answer to this question. Sorry, null/undefined are part of the language, and can be reasonably expected in real-world use across all the platforms and libraries that use JS, so a non-cumbersome solution is necessary.Chaparro
F
298

Combining the above answers, it seems the most complete answer would be:

if( typeof variable === 'undefined' || variable === null ){
    // Do stuff
}

This should work for any variable that is either undeclared or declared and explicitly set to null or undefined. The boolean expression should evaluate to false for any declared variable that has an actual non-null value.

Florentinaflorentine answered 11/10, 2013 at 17:2 Comment(8)
@Aerovistae I recognize that typeof is an operator, not a function, so it doesn't need the parentheses, but I appreciate the parentheses nonetheless - simply for reading clarity.Devanagari
what about directly checking if(variable===undefined) instead of using typeof?Badge
@ArjunU that will cause a ReferenceError if the variable isn't declared. If you don't know whether or not a variable is declared, used the above solution. If you can guarantee that the variable is at least declared, you can use variable == nullPharmacology
This is a better solution because as @Pharmacology pointed out, the variable might not be declared.Zippel
Correct me if I am wrong, but isn't the first conditional a superset of the second one, and therefore the second conditional is superfluous?Amyotonia
@MarchHo No. The first conditional can be false, and the second conditional can be true. Consider the case when variable is defined and has the value null.Windcheater
Thanks for using typeof. The var == null way does not "catch" both a null and an undefined, so my if/else statement is useless. But when I use typeof, my else will get used and I can control the error printout.Hamman
I used just the first part if( typeof variable === 'undefined' ){} since adding the null part would throw a ReferenceErrorToscanini
S
193
if (variable == null) {
    // Do stuff, will only match null or undefined, this won't match false
}
Sakhuja answered 15/4, 2010 at 18:25 Comment(9)
Just in case anybody thinks this is another half-answer, this actually does work. undefined evaluates equal to null.Condensable
Failed to me in chrome console... ReferenceError: variable is not defined, so it might work, but not for me...Chirrupy
It only works for declared variables, not variables that may or may not be declared, which is rarely the case. (You need to use typeof + a null check for that case)Sakhuja
For some reason JSHint doesn't like this. :(Sitar
Just figured out you can add this comment: /*jshint eqnull:true */ to the top of your JS document or function, and JSHint will stop warning you about your uses of == null.Sitar
as user216441 pointed out this is a nogo for undeclared variables jsfiddle.net/U2VHs/3Bag
@Aerovistae can you point me to a reference that explicitly states that == is broken. The coercive if(variable == null) in this answer makes complete sense to me...Verwoerd
This answer is WRONG. An undefined variable produces ReferenceError.Devanagari
@Sakhuja “It only works for declared variables, not variables that may or may not be declared” So… it doesn't answer the question, which was “How do I determine if variable is undefined or null?” (It answers the question “How do I determine if known-to-be-defined variable is null?”)Chaparro
I
106
if (typeof EmpName != 'undefined' && EmpName) {

will evaluate to true if value is not:

  • null

  • undefined

  • NaN

  • empty string ("")

  • 0

  • false

Iver answered 7/5, 2015 at 7:24 Comment(9)
I think this is a dangerous technique that has spread like wild fire. Because a lot of the variables that are checked could be boolean or numbers. So if the user does not fully understand the consequences, this is no good.Chitkara
Please provide a reference of this javascript especificationDecalcify
This is the same as if (EmpName). If it's undefined will be falsy already.Unpolitic
If variable is not defined. then if(EmpName) will throw errorIver
@Iver I think Rudy might have meant this var EmpName; if (EmpName). Where the variable is defined but not assigned a value.Hornbeck
@Iver As Aerovistae wrote under "Edit again", you shouldn't be using undefined variables, and throwing an error in this case is good because you'll notice the mistake quickly and fix it.Cheapskate
@DavidKnipe that will ReferenceError and break execution if the variable is not defined or referred to at all in the code, using typeof is safer. If its saas then no problem, If its like self hosted application. Fixing a bug is mess.Iver
@Iver I think you've misread what I wrote. I agree that leaving out the typeof check will cause a ReferenceError if the variable is not declared. The typeof check just means that instead of a compile-time error, the expression will simply evaluate to false. This isn't what OP should want - he should want to fix the undeclared variable. So instead of an error which will immediately be found by a developer, you'll get a potentially much more subtle bug which may take some time to debug and may get into production unnoticed. So in this case it's better to let it throw the exception.Cheapskate
I do believe if(variable === undefined) without the quotes works best for catching any undefined object or primitive before sending it on to other instructions that might crash with it.Corody
G
56

Probably the shortest way to do this is:

if(EmpName == null) { /* DO SOMETHING */ };

Here is proof:

function check(EmpName) {
  if(EmpName == null) { return true; };
  return false;
}

var log = (t,a) => console.log(`${t} -> ${check(a)}`);

log('null', null);
log('undefined', undefined);
log('NaN', NaN);
log('""', "");
log('{}', {});
log('[]', []);
log('[1]', [1]);
log('[0]', [0]);
log('[[]]', [[]]);
log('true', true);
log('false', false);
log('"true"', "true");
log('"false"', "false");
log('Infinity', Infinity);
log('-Infinity', -Infinity);
log('1', 1);
log('0', 0);
log('-1', -1);
log('"1"', "1");
log('"0"', "0");
log('"-1"', "-1");

// "void 0" case
console.log('---\n"true" is:', true);
console.log('"void 0" is:', void 0);
log(void 0,void 0); // "void 0" is "undefined" 

And here are more details about == (source here)

Enter image description here

BONUS: reason why === is more clear than == (look on agc answer)

Enter image description here

Georgetown answered 7/1, 2020 at 15:47 Comment(4)
Thank you, great answer! What about expressions like if(var) or if(!var) ?Saltigrade
@Saltigrade example difference: if(var)/if(!var) will execute code for values true/false. The if(var == null) for those values of var NEVER execute code...Osprey
Well, this is trivial, but can one of the matrices above also be used to check what the if expressions yield for different values?Saltigrade
@Saltigrade in my answer there is link to source of this picutres - there is also if statement "matrix" thereOsprey
C
33

jQuery attr() function returns either a blank string or the actual value (and never null or undefined). The only time it returns undefined is when your selector didn't return any element.

So you may want to test against a blank string. Alternatively, since blank strings, null and undefined are false-y, you can just do this:

if (!EmpName) { //do something }
Caelian answered 15/4, 2010 at 18:20 Comment(3)
Chrome 17.0.963.78 m gives this error: ReferenceError: EmpName is not definedChirrupy
@EranMedan I know this is late, but it will hopefully help people who come here later. The reason you get an error is because it has not been declared at all. Usually you'd have EmpName(or some other variable) be passed into a function, or the return value of another function and therefore declared(Example: "var x;"). To test if it returned undefined, or null, or blank string, you can use the above solution.Stress
I realise this is a cold question, but jQuery will return undefined if the attribute doesn't exist on the element (not just just if the selector has no matching elements, as per the answer). For example, an img with no src would return undefined for $('img').attr('src');Athodyd
F
28

Edited answer: In my opinion, you shouldn't use the function from my below old answer. Instead, you should probably know the type of your variable and use the according to check directly (for example, wondering if an array is empty? just do if(arr.length===0){} etc.). This answer doesn't even answer OP's question.


I've come to write my own function for this. JavaScript is weird.

It is usable on literally anything. (Note that this also checks if the variable contains any usable values. But since this information is usually also needed, I think it's worth posting). Please consider leaving a note.

function empty(v) {
    let type = typeof v;
    if (type === 'undefined') {
        return true;
    }
    if (type === 'boolean') {
        return !v;
    }
    if (v === null) {
        return true;
    }
    if (v === undefined) {
        return true;
    }
    if (v instanceof Array) {
        if (v.length < 1) {
            return true;
        }
    } else if (type === 'string') {
        if (v.length < 1) {
            return true;
        }
        if (v === '0') {
            return true;
        }
    } else if (type === 'object') {
        if (Object.keys(v).length < 1) {
            return true;
        }
    } else if (type === 'number') {
        if (v === 0) {
            return true;
        }
    }
    return false;
}

TypeScript-compatible.


This function should do exactly the same thing like PHP's empty() function (see RETURN VALUES)

Considers undefined, null, false, 0, 0.0, "0" {}, [] as empty.

"0.0", NaN, " ", true are considered non-empty.

Ferment answered 24/10, 2015 at 15:14 Comment(3)
I have run into a little null checking problem. I want to check if a parameter being passed is null, or an empty object { }. This is a common and silly language problem, but I had forgotten about it. All my searches show answers for undefined of null value, or loose equality comparisons ( == ), but not strict equality ( === ) or equivalent. And then here in your -1 ranked answer at the very bottom of the page (before I upvoted) is the answer that eluded me. Object.keys( obj ).length < 1 or maybe === 0, assuming it will never be -1. Anyways, upvoted to 0, woo. :pWrennie
Thanks, I've been able to drop this function in and clean up a lot of code. Why this isn't a standard JS function is beyond me.Hypochlorite
You should change all of your == to === here, then this would be a reasonable function.Baudelaire
T
25

The shortest and easiest:

if(!EmpName ){
 // DO SOMETHING
}

this will evaluate true if EmpName is:

  • null
  • undefined
  • NaN
  • empty
  • string ("")
  • 0
  • false
Tello answered 15/8, 2019 at 10:15 Comment(1)
Use case here is that I want to know the difference between undefined and false. I will use the check on null then.Longship
G
15

If the variable you want to check is a global, do

if (window.yourVarName) {
    // Your code here
}

This way to check will not throw an error even if the yourVarName variable doesn't exist.

Example: I want to know if my browser supports History API

if (window.history) {
    history.back();
}

How this works:

window is an object which holds all global variables as its properties, and in JavaScript it is legal to try to access a non-existing object property. If history doesn't exist then window.history returns undefined. undefined is falsey, so code in an if(undefined){} block won't run.

Gi answered 10/2, 2014 at 16:30 Comment(2)
Readers should note that an approach like this is idiomatic for checking - from JavaScript running in a browser - whether a global variable has been declared, and especially whether a browser-provided global (like the history API) is available. It will not work for checking whether a non-global variable is null or undefined, nor will it work if your JavaScript is running outside a browser (i.e. in Node.js). It will also treat globals set to 0, false or '' the same as those which are undeclared or undefined or null, which is usually fine.Pressurize
This assumes that the script is running in a browser. That's not a given.Norine
B
13

In JavaScript, as per my knowledge, we can check an undefined, null or empty variable like below.

if (variable === undefined){
}

if (variable === null){
}

if (variable === ''){
}

Check all conditions:

if(variable === undefined || variable === null || variable === ''){
}
Blenheim answered 7/11, 2019 at 4:39 Comment(2)
var is a reserved word, this will throw SyntaxErrorBridwell
@Bridwell implemented from var to variableBlenheim
H
10

Since you are using jQuery, you can determine whether a variable is undefined or its value is null by using a single function.

var s; // undefined
jQuery.isEmptyObject(s); // will return true;

s = null; // defined as null
jQuery.isEmptyObject(s); // will return true;

// usage
if(jQuery.isEmptyObject(s)){
    alert('Either variable: s is undefined or its value is null');
}else{
     alert('variable: s has value ' + s);
}

s = 'something'; // defined with some value
jQuery.isEmptyObject(s); // will return false;
Hymie answered 8/7, 2014 at 8:0 Comment(1)
This did not work for me. I still got the error: ReferenceError: s is not defined for the first example.Phototonus
S
10

You can simply use the following (I know there are shorter ways to do this, but this may make it easier to visually observe, at least for others looking at the code).

if (x === null || x === undefined) {
 // Add your response code here, etc.
}

source: https://www.growthsnippets.com/how-can-i-determine-if-a-variable-is-undefined-or-null/

Shorten answered 29/7, 2019 at 14:25 Comment(0)
P
9

I've just had this problem i.e. checking if an object is null.
I simply use this:

if (object) {
    // Your code
}

For example:

if (document.getElementById("enterJob")) {
    document.getElementById("enterJob").className += ' current';
}
Pester answered 15/10, 2013 at 16:44 Comment(1)
it would be better to set var A = document.getElementById("enterJob") if(A)A.className+= ' current'; this way you do 50% work for same result... But maybe you just did it for shows and then I salute.Illegality
G
7

With the newest javascript changes, you can use the new logical operator ??= to check if the left operand is null or undefined and if so assign the value of right operand.

SO,

if(EmpName == null){  // if Variable EmpName null or undefined
  EmpName = 'some value';
};

Is equivalent to:

EmpName ??= 'some value';
Gesture answered 25/5, 2021 at 0:48 Comment(0)
W
5

jQuery check element not null:

var dvElement = $('#dvElement');

if (dvElement.length  > 0) {
    // Do something
}
else{
    // Else do something else
}
Weirick answered 4/3, 2015 at 17:10 Comment(0)
A
4

The easiest way to check is:

if(!variable) {
  // If the variable is null or undefined then execution of code will enter here.
}
Arlyne answered 28/5, 2019 at 6:30 Comment(5)
This will execute the code if the variable has a value of false, which is potentially undesirable.Spineless
The question is clear "How to determine if variable is 'undefined' or 'null'?" and in javascript if a variable has a value of null or undefined,its value is false.Arlyne
Sorry, but that's incorrect. Here is a JSfiddle to prove it.Spineless
By your answer, undefined, null and a few other things like empty string, +0, -0 NaN and false get through. ! operator coerces the operand- here variable- to Boolean: ecma-international.org/ecma-262/#sec-tobooleanCheckmate
But check the question: "How to determine if a variable is undefined or null", the ! operand used with an if will always return to true if the variable is null or undefined.Arlyne
G
4

No one seems to have to posted this yet, so here we go:

a?.valueOf() === undefined works reliably for either null or undefined.

The following works pretty much like a == null or a == undefined, but it could be more attractive for purists who don't like == 😎

function check(a) {
  const value = a?.valueOf(); 
  if (value === undefined) {
    console.log("a is null or undefined");
  }
  else {
    console.log(value);
  }
}

check(null);
check(undefined);
check(0);
check("");
check({});
check([]);

On a side note, a?.constructor works too:

function check(a) {
  if (a?.constructor === undefined) {
    console.log("a is null or undefined");
  }
}

check(null);
check(undefined);
check(0);
check("");
check({});
check([]);

Updated: we worked out a better way with a fellow StackOverflow member.

I'd personally do:

if (Object.is(a ?? null, null)) {
  // a is null or undefined
}
Grassy answered 14/7, 2022 at 0:22 Comment(2)
a?.valueOf() === undefined works reliably”…. Uh, a = {valueOf() {}}.Monty
Yeah you should have also mentioned a = Object.create(null), which could be a less silly but equally useless thing. It isn't a bug a human could introduce by mistake, it has to be done on purpose. Otherwise, yes, it's JavaScript and you can hack it however you want.Grassy
B
3

I run this test in the Chrome console. Using (void 0) you can check undefined:

var c;
undefined
if (c === void 0) alert();
// output =  undefined
var c = 1;
// output =  undefined
if (c === void 0) alert();
// output =   undefined
// check c value  c
// output =  1
if (c === void 0) alert();
// output =  undefined
c = undefined;
// output =  undefined
if (c === void 0) alert();
// output =   undefined
Blamed answered 18/5, 2016 at 20:10 Comment(0)
H
3

With the solution below:

const getType = (val) => typeof val === 'undefined' || !val ? null : typeof val;
const isDeepEqual = (a, b) => getType(a) === getType(b);

console.log(isDeepEqual(1, 1)); // true
console.log(isDeepEqual(null, null)); // true
console.log(isDeepEqual([], [])); // true
console.log(isDeepEqual(1, "1")); // false
etc...

I'm able to check for the following:

  • null
  • undefined
  • NaN
  • empty
  • string ("")
  • 0
  • false
Hephaestus answered 12/12, 2017 at 10:29 Comment(2)
This does not answer the question, which is "how do I catch null and undefined?" not "how do I catch every falsey value in JavaScript?"Unrelenting
@Aerovistae, I thought I did with console.log(isDeepEqual(null, null)); and console.log(isDeepEqual(undefined, undefined)); ?Hephaestus
G
3

if you create a function to check it:

export function isEmpty (v) {
 if (typeof v === "undefined") {
   return true;
 }
 if (v === null) {
   return true;
 }
 if (typeof v === "object" && Object.keys(v).length === 0) {
   return true;
 }

 if (Array.isArray(v) && v.length === 0) {
   return true;
 }

 if (typeof v === "string" && v.trim().length === 0) {
   return true;
 }

return false;
}
Granuloma answered 11/5, 2020 at 6:9 Comment(0)
B
2

To test if a variable is null or undefined I use the below code.

    if(typeof sVal === 'undefined' || sVal === null || sVal === ''){
      console.log('variable is undefined or null');
    }
Bullfinch answered 3/3, 2016 at 4:57 Comment(4)
Close but no. Lose the typeof and compare to undefined straight out, not as a string. This works but the extra operator has no effect but to make it wordier.Unrelenting
In this case yes you are right we don't need to use typeof. But it's a good practice to use typeof when you are dealing with undefined variables. One reason to use typeof is that it does not throw an error if the variable has not been declared.Bullfinch
That's actually a bad thing. You don't want undeclared variables in your code. You want that to throw a ReferenceError so you can find the variable and declare it. Certainly you wouldn't try that in a compiled language like C++! Just because JS allows it doesn't mean it should be done.Unrelenting
Your or statement is backwards. Checking that something is undefined would be the first step, not the second.Luckless
O
2
(null == undefined)  // true

(null === undefined) // false

Because === checks for both the type and value. Type of both are different but value is the same.

Orchestra answered 27/5, 2018 at 11:19 Comment(0)
E
2

Let's look at this,

  1.  

    let apple; // Only declare the variable as apple
    alert(apple); // undefined
    

    In the above, the variable is only declared as apple. In this case, if we call method alert it will display undefined.

  2.  

       let apple = null; /* Declare the variable as apple and initialized but the value is null */
       alert(apple); // null
    

In the second one it displays null, because variable of apple value is null.

So you can check whether a value is undefined or null.

if(apple !== undefined || apple !== null) {
    // Can use variable without any error
}
Enyedy answered 11/2, 2020 at 5:47 Comment(0)
B
2

The foo == null check should do the trick and resolve the "undefined OR null" case in the shortest manner. (Not considering "foo is not declared" case.) But people who are used to have 3 equals (as the best practice) might not accept it. Just look at eqeqeq or triple-equals rules in eslint and tslint...

The explicit approach, when we are checking if a variable is undefined or null separately, should be applied in this case, and my contribution to the topic (27 non-negative answers for now!) is to use void 0 as both short and safe way to perform check for undefined.

Using foo === undefined is not safe because undefined is not a reserved word and can be shadowed (MDN). Using typeof === 'undefined' check is safe, but if we are not going to care about foo-is-undeclared case the following approach can be used:

if (foo === void 0 || foo === null) { ... }
Bridwell answered 16/3, 2020 at 23:27 Comment(0)
R
1

You can do something like this, I think its more efficient for multiple value check on the same variable in one condition

const x = undefined;
const y = null;
const z = 'test';

if ([undefined, null].includes(x)) {
  // Will return true
}

if ([undefined, null].includes(y)) {
  // Will return true
}

if ([undefined, null].includes(z)) {
  // Will return false
}
Redwood answered 25/5, 2022 at 3:19 Comment(0)
V
1

You can do (value ?? null) === null as well if you’d like to stick with the === operator and clarify the code.


So, three ways, so far.

  • value == null
  • value === null || value === undefined
  • (value ?? null) === null

I usually avoid ==, but this time, I’d prefer == null.

View answered 29/5, 2023 at 23:12 Comment(3)
@noseratio-opentowork Well, you negate that and it’ll work.Monty
Maybe I'm missing something, but why do you need Symbol()❓ Why not just (a ?? null) === null ❓ Or, (a ?? undefined) === undefinedGrassy
@noseratio-opentowork Thank you for pointing it out. I unnecessarily overcomplicated it and I don’t understand myself when I wrote it either. Maybe I was tried to check if it was coalesced into the second operand.Monty
Q
0

Calling typeof null returns a value of “object”, as the special value null is considered to be an empty object reference. Safari through version 5 and Chrome through version 7 have a quirk where calling typeof on a regular expression returns “function” while all other browsers return “object”.

Quitrent answered 6/3, 2014 at 11:24 Comment(0)
C
0
var x;
if (x === undefined) {
    alert ("only declared, but not defined.")
};
if (typeof y === "undefined") {
    alert ("not even declared.")
};

You can only use second one: as it will check for both definition and declaration

Cahilly answered 15/8, 2015 at 7:18 Comment(0)
O
0
var i;

if (i === null || typeof i === 'undefined') {
    console.log(i, 'i is undefined or null')
}
else {
    console.log(i, 'i has some value')
}
Ostraw answered 4/12, 2016 at 0:10 Comment(4)
What happens if the user enters the word 'undefined' ?Condensable
Your question is good, it show condition is true so that we need to change the option normal undefined into typeof condition. @CondensableOstraw
This is wrong. typeof will never yield undefined, only the string 'undefined'. Moreover, i == null is already true if i is undefined, so the second boolean would be redundant even if it worked.Unrelenting
This solution (with the conditions reversed) was already provided by @Florentinaflorentine on Oct 11, 2013. https://mcmap.net/q/40474/-how-can-i-determine-if-a-variable-is-39-undefined-39-or-39-null-39 This code-only post is completely useless because it adds no new value to the page. In fact, it is adding page bloat and wasting researchers time reading it. Please remove this answer.Yielding
C
0

I still think the best/safe way to test these two conditions is to cast the value to a string:

var EmpName = $("div#esd-names div#name").attr('class');

// Undefined check
if (Object.prototype.toString.call(EmpName) === '[object Undefined]'){
    // Do something with your code
}

// Nullcheck
if (Object.prototype.toString.call(EmpName) === '[object Null]'){
    // Do something with your code
}
Centavo answered 31/5, 2017 at 7:47 Comment(4)
can you explain why you believe this is the "best/safe way" to perform the tests?Baneful
Because the conversion is always returning a "standardized" string (i.e. [object Undefined]), so you don't get into trouble by testing falsy values. That's just my opinion based on experiences I had with truthy/falsy values.Centavo
Thanks for the explanation. I'm not criticizing, its an interesting answer, I just wanted you to provide some explanation for others as to why this is potentially superior to other methods.Baneful
No worries! I had a lot of issues with this type of comparisons, and until now, I find it as the most useful approach for this matter.Centavo
P
-2

Best way:

if(typeof variable==='undefined' || variable===null) {

/* do your stuff */
}
Pose answered 25/5, 2016 at 11:55 Comment(1)
This exact solution was already provided by @Florentinaflorentine on Oct 11, 2013. https://mcmap.net/q/40474/-how-can-i-determine-if-a-variable-is-39-undefined-39-or-39-null-39 This code-only post is completely useless because it adds no new value to the page. In fact, it is adding page bloat and wasting researchers time reading it. Please remove this answer.Yielding
F
-4

You can check if the value is undefined or null by simply using typeof:

if(typeof value == 'undefined'){
Forenoon answered 26/7, 2017 at 2:16 Comment(2)
See comments in the previous answer (https://mcmap.net/q/40474/-how-can-i-determine-if-a-variable-is-39-undefined-39-or-39-null-39) regarding typeof.Global
This is incorrect. Does not catch null. I do not understand why new, incorrect answers are being provided to a question that was given a correct and complete answer many years ago. Do you feel the current answers are somehow insufficient?Unrelenting
B
-13

Simplest answer:

if(!EmpName){
  // DO SOMETHING
};
Blueing answered 30/3, 2021 at 21:48 Comment(1)
This way, you target also falsy values such as 0 or '', whereas we want to target only nullish/undefined valuesMidland

© 2022 - 2024 — McMap. All rights reserved.