I\'ve been writing JavaScript for quite a long time now, and I have never had a reason to use null
. It seems that undefined
is always preferable an
Here's a reason: var undefined = 1
is legal javascript, but var null = 1
is a syntax error. The difference is that null
is a language keyword, while undefined
is, for some reason, not.
If your code relies on comparisons to undefined
as if it's a keyword (if (foo == undefined)
-- a very easy mistake to make) that only works because nobody has defined a variable with that name. All that code is vulnerable to someone accidentally or maliciously defining a global variable with that name. Of course, we all know that accidentally defining a global variable is totally impossible in javascript...
Unknown variable: undefined
.
Known variable yet no value: null
.
server_object
.server_object.errj
. It tells you it’s undefined
. That means it doesn’t know what that is.server_object.err
. It tells you it’s null
. That means you’re referencing a correct variable but it’s empty; therefore no error.The problem is when you declare a variable name without a value (var hello
) js declares that as undefined
: this variable doesn’t exist; whereas programmers mostly mean: “I’ve not given it a value yet”, the definition of null
.
So the default behavior of a programmer—declaring a variable without a value as nothing—is at odds with js—declaring it as not existing. And besides, !undefined
and !null
are both true
so most programmers treat them as equivalent.
You could of course ensure you always do var hello = null
but most won’t litter their code as such to ensure type sanity in a deliberately loosely-typed language, when they and the !
operator treat both undefined
and null
as equivalent.
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 simiplifies things a lot. I never have to check if x === undefined || x === null. 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 - ie 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'm working through this exact question right now, and looking at the following philosophy:
For me, this question is significant because anyone calling a function that returns a result should have no question as to whether to test for undefined vs null.
This answer does not attempt to address:
In my opinion, variables are your own business and not a part of your API, and properties in any OO system are defined and therefore should be defined with value different from what they would be if not defined (null for defined, undefined is what you get when accessing something that is not in your object).
undefined is where no notion of the thing exists; it has no type, and it's never been referenced before in that scope; null is where the thing is known to exist, but it has no value.
Everyone has their own way of coding and their own internal semantics, but over the years I have found this to be the most intuitive advice that I give people who ask this question: when in doubt, do what JavaScript does.
Let's say you are working with object properties like options for a jQuery plugin...ask yourself what value JavaScript gives a property that has yet to be defined -- the answer is undefined
. So in this context, I would initialize these types of things with 'undefined' to be consistent with JavaScript (for variables, you can do var myVar;
instead of var myVar = undefined;
).
Now let's say you are doing DOM manipulation...what value does JavaScript assign to non-existent elements? The answer is null
. This is the value I would initialize with if you are creating a placeholder variable that will later hold a reference to an element, document fragment, or similar that relates to the DOM.
If you're working with JSON, then a special case needs to be made: for undefined property values, you should either set them to ""
or null
because a value of undefined
is not considered proper JSON format.
With this said, as a previous poster has expressed, if you find that you're initializing stuff with null
or undefined
more than once in a blue moon, then maybe you should reconsider how you go about coding your app.