What reason is there to use null instead of undefined in JavaScript?
At the end of the day, because both null
and undefined
coerce to the same value (Boolean(undefined) === false && Boolean(null) === false
), you can technically use either to get the job done. However, there is right way, IMO.
Leave the usage of
undefined
to the JavaScript compiler.undefined
is used to describe variables that do not point to a reference. It is something that the JS compiler will take care for you. At compile time the JS engine will set the value of all hoisted variables toundefined
. As the engine steps through the code and values becomes available the engine will assign respective values to respective variables. For those variables for whom it did not find values, the variables would continue to maintain a reference to the primitiveundefined
.Only use null if you explicitly want to denote the value of a variable as having "no value".
As @com2gz states:
null
is used to define something programmatically empty.undefined
is meant to say that the reference is not existing. Anull
value has a defined reference to "nothing". If you are calling a non-existing property of an object, then you will getundefined
. If I would make that property intentionally empty, then it must benull
so you know that it's on purpose.
TLDR; Don't use the undefined
primitive. It's a value that the JS compiler will automatically set for you when you declare variables without assignment or if you try to access properties of objects for which there is no reference. On the other hand, use null
if and only if you intentionally want a variable to have "no value".
I never explicitly set anything to undefined (and I haven't come across this in the many codebases I've interacted with). Also, I rarely use null
. The only times I use null
is when I want to denote the value of an argument to a function as having no value, i.e.,:
function printArguments(a,b) {
console.log(a,b);
}
printArguments(null, " hello") // logs: null hello
null
and undefined
are essentially two different values that mean the same thing. The only difference is in the conventions of how you use them in your system. As some have mentioned, some people use null
for meaning "no object" where you might sometimes get an object while undefined means that no object was expected (or that there was an error). My problem with that is its completely arbitrary, and totally unnecessary.
That said, there is one major difference - variables that aren't initialized (including function parameters where no argument was passed, among other things) are always undefined.
Which is why in my code I never use null unless something I don't control returns null (regex matching for example). The beauty of this is it simplifies things a lot. I never have to check if x === undefined || x === null
, I can just check x === undefined
. And if you're in the habit of using ==
or simply stuff like if(x) ...
, stop it.
!x
will evaluate to true for an empty string, 0
, null
, NaN
- i.e. things you probably don't want. If you want to write javascript that isn't awful, always use triple equals ===
and never use null
(use undefined
instead). It'll make your life way easier.
I don't really have an answer, but according to Nicholas C. Zakas, page 30 of his book "Professional JavaScript for Web Developers":
When defining a variable that is meant to later hold an object, it is advisable to initialize the variable to
null
as opposed to anything else. That way, you can explicitly check for the valuenull
to determine if the variable has been filled with an object reference at a later time