What is the difference between...
if(myVar.constructor == String)
and
if(typeof myVar == \"string\")
typeof
can be a little misleading. Note the following behavior:typeof
fails on real String instances:
typeof "snub"
// "string" -- as expected
typeof new String("snub")
// "object" -- even if it's still the string you're after
.constructor
consistently yields the expected result:
"snub".constructor == String
// true -- as expected
new String("snub").constructor == String
// true -- as expected
All primitive values in JavaScript have a corresponding object wrapper. It's from where primitives find a prototype chain to inherit from.
Values in JavaScript can be expressed in primitive form (specially inheriting from their respective objects), or directly in object form. It's possible some of your strings are converted into String instances along the way -- by a library perhaps -- and you won't even know it. String objects and primitives generally behave the same way. Except for with typeof
, of course.
Directly in object form -- even while the inner value may represent something that is a string, number, or otherwise -- typeof
will respond with "object"
.
.constructor
is a more reliable way to identify an object's type, and is directly available to your primitive values (like all the rest of their inherited functionality) thanks to a language feature called Autoboxing.