var obj = {};
typeof obj; // returns "object"
obj instanceof Object // return true
typeof null // returns "object"
null instanceof Object // returns false
And how about
typeof undefined // return "undefined"
undefined instanceof undefined
// ERROR: Uncaught TypeError: Expecting a function in instanceof check,
// but got undefined
Why is this the case? I have read a lot about related topics on SO but still can't get this.
Understand that 'typeof' would return a String, so it pretty much reflects the rules in Javascript.(eg. null is a object... well fine..) But why "null instanceof Object" return false ?
"x instanceof y"
Does it mean 'x' has to be created by the 'y' constructor? And for null this is not the case ?
EDIT
Would really appreciate if you could explain the different intention behind instanceof and typeof otherthan then syntax and return value.
Difference between null and undefined
typeof null // object (bug in ECMAScript, should be null)
typeof undefined // undefined
null === undefined // false
null == undefined // true
REF
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof
It's just the design decision which might be contrived or weird. According to the typeof
UnaryExpression if evaluated as the following. I've just included the poin that matters.
ECMA Spec:
Return a String determined by Type(val)
according to Table 20.
Table 20:
╔═════════════╦══════════╗
║ Type of val ║ Result ║
╠═════════════╬══════════╣
║ null ║ "object" ║
╚═════════════╩══════════╝
So, there's nothing we can do about it. It's status-by-design. But it's correct to return false
because, there is a separate type for null
called Null type
Null type:
type whose sole value is the null value
null
isn't an instance of Object, obviously, since it has got it's own type. It's just that typeof
operator returns "object"
. It's got to do with the design of javascript.
Why is it so? Will have to ask Brendan Eich(Founder of Javascript).
instanceof
more appealing, however you checked instaceof undefined
going throw exception that because the undefined is not any singular type object name, It's may or may not sub method
of JavaScript Object
. Because undefined
that type for null
(Null Type).
typeof undefined // return "undefined"
undefined instanceof Object // return False
You should check undefined is instaceof
JS object, that give a no it's not the object. It's give a boolean
result.
That's a common bug of ECMAScript.
null
is not an object
, it's a primitive value.(So you can't modify it like adding properties to it)
typeof null
should return null
typeof null // object (bug in ECMAScript, should be null)
typeof undefined // undefined
null === undefined // false
null == undefined // true
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null
EDITED
It's not available to see though
Changed 3 weeks ago by brendan
You know, this all came about because
of rushing in early May 1995, which led to a leak of type tag
representation shared by null and object types. But null means "no
object", so it didn't raise hackles until it was too late to fix in
Netscape 2, and after that we were loath to "fix" it and "break the
web". That argument only applies more in degree of web population now.
We have other fish to fry. This one was has been swallowed already.
Let's not change typeof null for ES4 and work on more vital issues.
http://web.archive.org/web/20071110193102/http://bugs.ecmascript.org/ticket/250
also check this answer
Why is null an object and what's the difference between null and undefined?