-
-
Save cowboy/1131946 to your computer and use it in GitHub Desktop.
| // See http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/ | |
| (function(global) { | |
| // Maintain a map of already-encountered types for super-fast lookups. This | |
| // serves the dual purpose of being an object from which to use the function | |
| // Object.prototype.toString for retrieving an object's [[Class]]. | |
| var types = {}; | |
| // Return a useful value based on a passed object's [[Class]] (when possible). | |
| Object.toType = function(obj) { | |
| var key; | |
| // If the object is null, return "Null" (IE <= 8) | |
| return obj === null ? "Null" | |
| // If the object is undefined, return "Undefined" (IE <= 8) | |
| : obj == null ? "Undefined" | |
| // If the object is the global object, return "Global" | |
| : obj === global ? "Global" | |
| // Otherwise return the XXXXX part of the full [object XXXXX] value, from | |
| // cache if possible. | |
| : types[key = types.toString.call(obj)] || (types[key] = key.slice(8, -1)); | |
| }; | |
| }(this)); |
I dig the Global check. Imma add that to my projects that have similar methods. I will post a link when I update it to detect global on server-side enviros too.
cowboy
yeah good call on the IE7 / IE8 undefined/null issue (your second "// If the object is undefined, return "Null" (IE <= 8)" is wrong :-)
jd - I did the global check in my original article too :-;
@angus-c You win double internets \o/
@angus-c why is it wrong? If obj === null then obj is null. If that check fails, if obj == null then obj must be undefined.
@angus-c hahaha thanks, fixed! I think I need more sleep.
I know this is ancient code, but for anyone stumbling on this today (mid 2014), note that PhantomJS currently returns "DomWindow" for both undefined and null (it's a known bug, but still)
See this JSFiddle example.