Why is null
considered an object
in JavaScript?
Is checking
if ( object == null )
Do something
the
TLDR
undefined
is a primitive value in JavaScript that indicates the implicit absence of a value. Uninitialized variables automatically have this value, and functions without an explicit return
statement, return undefined
.
null
is also a primitive value in JavaScript. It indicates the intentional absence of an object value. null
in JavaScript was designed to enable interoperability with Java.
typeof null
returns "object"
because of a peculiarity in the design of the language, stemming from the demand that JavaScript be interoperable with Java. It does not mean null
is an instance of an object. It means: given the tree of primitive types in JavaScript, null
is part of the "object-type primitive" subtree. This is explained more fully below.
Details
undefined
is a primitive value that represents the implicit absence of a value. Note that undefined
was not directly accessible until JavaScript 1.3 in 1998. This tells us that null
was intended to be the value used by programmers when explicitly indicating the absence of a value. Uninitialized variables automatically have the value undefined
. undefined
is a one-of-a-kind type in the ECMAScript specification.
null
is a primitive value that represents the intentional absence of an object value. null
is also a one-of-a-kind type in the ECMAScript specification.
null
in JavaScript was designed with a view to enable interoperability with Java, both from a "look" perspective, and from a programatic perspective (eg the LiveConnect Java/JS bridge planned for 1996). Both Brendan Eich and others have since expressed distaste at the inclusion of two "absence of value" values, but in 1995 Eich was under orders to "make [JavaScript] look like Java".
Brendan Eich:
If I didn't have "Make it look like Java" as an order from management, and I had more time (hard to unconfound these two causal factors), then I would have preferred a Self-like "everything's an object" approach: no Boolean, Number, String wrappers. No undefined and null. Sigh.
In order to accommodate Java's concept of null
which, due to the strongly-typed nature of Java, can only be assigned to variables typed to a reference type (rather primitives), Eich chose to position the special null
value at the top of the object prototype chain (ie. the top of the reference types), and to include the null
type as part of the set of "object-type primitives".
The typeof
operator was added shortly thereafter in JavaScript 1.1, released on 19th August 1996.
From the V8 blog:
typeof null
returnsobject
, and notnull
, despitenull
being a type of its own. To understand why, consider that the set of all JavaScript types is divided into two groups:
- objects (i.e. the Object type)
- primitives (i.e. any non-object value)
As such,
null
means “no object value”, whereasundefined
means “no value”.
Following this line of thought, Brendan Eich designed JavaScript to make
typeof
return 'object' for all values on the right-hand side, i.e. all objects and null values, in the spirit of Java. That’s whytypeof null === 'object'
despite the spec having a separatenull
type.
So Eich designed the heirarchy of primitive types to enable interoperability with Java. This led to him positioning null
along with the "object-type primitives" on the heirarchy. To refelct this, when typeof
was added to the language shortly thereafter, he chose typeof null
to return "object"
.
The surprise expressed by JavaScript developers at typeof null === "object"
is the result of an impedance mismatch (or abstraction leak) between a weakly-typed language (JavaScript) that has both null
and undefined
, and another, strongly-typed language (Java) that only has null
, and in which null
is strictly defined to refer to a reference type (not a primitive type).
Note that this is all logical, reasonable and defensible. typeof null === "object"
is not a bug, but a second-order effect of having to accommodate Java interoperability.
A number of imperfect backwards rationalisations and/or conventions have emerged, including that undefined
indicates implicit absence of a value, and that null
indicates intentional absence of a value; or that undefined
is the absence of a value, and null
is specifically the absence of an object value.
A relevant conversation with Brendan Eich, screenshotted for posterity: