-
-
Save deepsweet/991548 to your computer and use it in GitHub Desktop.
| // var type = | |
| function( | |
| a // target | |
| ){ | |
| return a == null ? // if null or undefined | |
| a + '' : // then convert it to string | |
| toString.call(a) // else call Object.prototype.toString method | |
| .slice(8, -1) // '[object Array]' -> 'Array' | |
| .toLowerCase() // 'Array' -> 'array' | |
| } | |
| // type([]) === 'array' | |
| // type({}) === 'object' | |
| // type('') === 'string' | |
| // type(1) === 'number' | |
| // type(true) === 'boolean' | |
| // type(function(){}) === 'function' | |
| // type(null) === 'null' | |
| // type(undefined) === 'undefined' |
| function(a){return a==null?a+'':toString.call(a).slice(8,-1).toLowerCase()} |
| Copyright (c) 2011 Kir Belevich, http://soulshine.in | |
| Permission is hereby granted, free of charge, to any person obtaining | |
| a copy of this software and associated documentation files (the | |
| "Software"), to deal in the Software without restriction, including | |
| without limitation the rights to use, copy, modify, merge, publish, | |
| distribute, sublicense, and/or sell copies of the Software, and to | |
| permit persons to whom the Software is furnished to do so, subject to | |
| the following conditions: | |
| The above copyright notice and this permission notice shall be | |
| included in all copies or substantial portions of the Software. | |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | |
| LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | |
| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
| WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| { | |
| "name": "type", | |
| "keywords": ["typeof", "type", "isArray"] | |
| } |
wow, i completely forgot about magic of slice.
thank you jed :)
nice! you can lose the {}. too, since it's available off of the global object.
lotta room left, how about normalizing case and adding support for null and undefined?
function(a){return a==null?a+"":toString.call(a).slice(8,-1).toLowerCase()}as i see there is no need to a==null?a+'', toString works fine with null by default.
toString.call(null) === "[object global]" // true
toString.call(undefined) === "[object global]" // truethat's strange, because i have both false in Chrome, Safari, Firefox and Opera.
i corrected the capitalization, so try again!
still getting false, already tried capitalizations.
i think we need to get back {}., looks like we have a different global in our tests.
please try ({}).toString.call(undefined) === "[object global]"
what strings do the above return for you when you remove the equality check?
({}).toString.call(undefined)
"[object Undefined]"
({}).toString.call(null)
"[object Null]"oops.
it's not so crossbrowser o_O, sorry.
your variant with a==null?a+'' works fine.
i think this is as good as it gets! maybe rename it to type to avoid confusion with the native operator?
you're right. renamed.
This will break in at least IE < 9 and isn't consistent for some objects in at least FF5. Using the window.toString should be ok on paper but isn't in practice. You should stick with {}.toString.call(...).
very useful! but how about: