function typeOf(value) { var type,toString=Object.prototype.toString, typeToString; if (value === null) { return 'null'; } type = typeof value; if (type === 'undefined' || type === 'string' || type === 'number' || type === 'boolean') { return type; } typeToString = toString.call(value); switch(typeToString) { case '[object Array]': return 'array'; case '[object Date]': return 'date'; case '[object Boolean]': return 'boolean'; case '[object Number]': return 'number'; case '[object RegExp]': return 'regexp'; } if (type === 'function') { return 'function'; } if (type === 'object') { if (value.nodeType !== undefined) { if (value.nodeType === 3) { return (/\S/).test(value.nodeValue) ? 'textnode' : 'whitespace'; } else { return 'element'; } } return 'object'; } }