<script type="text/javascript"> function saveName (firstName) {function capitalizeName () {return firstName.toUpperCase();}var capitalized = capitalizeName();console.log(capitalized instanceof String);return capitalized; }console.log(saveName("Robert")); // Returns "ROBERT"</script>
Question:
I want to check the type of capitalized , so I use capitalized instanceof String
? But it shows: false
in console, I do not want to try capitalized instanceof Function
, Object
...It will take too much time, so what is the best way to detect a variable type?
Best Answer
The best way is to use the typeof
keyword.
typeof "hello" // "string"
The typeof
operator maps an operand to one of eight possible values:
"string"
"number"
"object"
"function"
"undefined"
"boolean"
"symbol"
"bigint"
The instanceof
method tests if the provided function's prototype is in the object's prototype chain.
This MDN article does a pretty good job of summing up JavaScript's types.
use typeof();
example:
> typeof "foo""string"> typeof true"boolean"> typeof 42"number"
So you can do:
if(typeof bar === 'string') {//whatever}
Keep in mind that, typeof is only good for returning the "primitive" types, number, boolean, object, string. You can also use instanceof to test if an object is of a specific type.
function MyObj(prop) {this.prop = prop;}var obj = new MyObj(10);console.log(obj instanceof MyObj && obj instanceof Object); // outputs true
2021+ one liner answer.
My favourite way is not to use typeof
Why?because it doesn't give true type for other than boolean, string, number & function.
Then what?Here is small utility function using Object.prototype
🤩
var trueTypeOf = (obj) => Object.prototype.toString.call(obj).slice(8, -1).toLowerCase()
Results:
trueTypeOf([]); // arraytrueTypeOf({}); // objecttrueTypeOf(''); // stringtrueTypeOf(new Date()); // datetrueTypeOf(1); // numbertrueTypeOf(function () {}); // functiontrueTypeOf(/test/i); // regexptrueTypeOf(true); // booleantrueTypeOf(null); // nulltrueTypeOf(); // undefined
The best way is using typeof
typeof "blahha"
I made a function with help of jQuery library code, jQuery library type method github link .
var getType = (function() {var objToString = ({}).toString ,typeMap = {},types = [ "Boolean", "Number", "String", "Function", "Array", "Date","RegExp", "Object", "Error"];for ( var i = 0; i < types.length ; i++ ){typeMap[ "[object " + types[i] + "]" ] = types[i].toLowerCase();}; return function( obj ){if ( obj == null ) {return String( obj );}// Support: Safari <= 5.1 (functionish RegExp)return typeof obj === "object" || typeof obj === "function" ?typeMap[ objToString.call(obj) ] || "object" :typeof obj;}}());
You can call it as getType("Hello")
typeof capitalized == 'string'
The getVarType method (below) works for almost all variables. Check out this fiddle. It first uses the very fast typeof for cases where the results are reliable. Then it uses a more expensive toString method for other cases. Finally, if it is dealing with a named object (as returned by Firefox for objects like document.location) it checks for Array-like objects and reports them as arrays.
In comparison, typeof is embarrassingly poor. typeof([]) returns 'object', typeof(new Number()) returns object. It also returns 'object' for many other variables that aren't (for practical purposes) objects. See the fiddle results for a comparison.
// Begin public utility /getVarType/// Returns 'Function', 'Object', 'Array',// 'String', 'Number', 'Null', 'Boolean', or 'Undefined'//getVarType = (function () {var typeof_map = {'undefined' : 'Undefined','boolean' : 'Boolean','number' : 'Number','string' : 'String','function' : 'Function','Undefined' : 'Undefined','Null' : 'Null','Boolean' : 'Boolean','Number' : 'Number','String' : 'String','Function' : 'Function','Array' : 'Array','StyleSheetList' : 'Array'};return function( data ) {var type, type_str;if ( data === null ) { return 'Null'; }if ( data === undefined ) { return 'Undefined'; }type = typeof( data );type_str = typeof_map[ type ];if ( type_str ) { return type_str; }type = {}.toString.call( data ).slice( 8, -1 );return typeof_map[ type ]|| ( data instanceof Array ? 'Array' :( data.propertyIsEnumerable(0) && data.length !== undefined? 'Array' : 'Object' ));};}());// End public utility /getVarType/
The only possible failure mode happens if you are testing a named array that is empty (e.g. an empty enumerable DOM object besides the StyleSheetList). But on could add those to the type_of_map as needed.
I hope that helps!
ES-Next version with support BigInt
& Symbol
"use strict";/**** @author xgqfrms* @license MIT* @copyright xgqfrms* @created 2020-06-09* @modified** @description js data type checker* @augments* @example* @link**/const dataTypeChecker = (data, debug = false) => {const log = console.log;let result = ``;const typeString = Object.prototype.toString.call(data);result = typeString.replace(/\[object /gi, ``).replace(/\]/gi, ``);if(debug) {log(`true type`, result)}return result;};/*export default dataTypeChecker;export {dataTypeChecker,};*/
test
const dataTypeChecker = (data, debug = false) => {const log = console.log;let result = ``;const typeString = Object.prototype.toString.call(data);// const typeString = Object.prototype.toString.apply(data);result = typeString.replace(/\[object /gi, ``).replace(/\]/gi, ``);if(!debug) {log(`true type`, result)}return result;};const obj = {};const func = () => {};dataTypeChecker(NaN)//"[object Number]"dataTypeChecker(undefined)//"[object Undefined]"dataTypeChecker(true)//"[object Boolean]"dataTypeChecker({})//"[object Object]"dataTypeChecker(func)//"[object Function]"dataTypeChecker(obj)//"[object Object]"dataTypeChecker(Symbol())//"[object Symbol]"dataTypeChecker(null)//"[object Null]"dataTypeChecker(123)//"[object Number]"dataTypeChecker(BigInt(1n))//"[object BigInt]"// true type Number// true type Undefined// true type Boolean// true type Object// true type Function// true type Object// true type Symbol// true type Null// true type Number// true type BigInt
//-- difference constructor & typeof --//const fx = () => {}const arr = []const obj = {}console.log( fx.constructor == Function ) // trueconsole.log( arr.constructor == Array ) // trueconsole.log( arr.constructor == Object ) // falseconsole.log( obj.constructor == Object ) // trueconsole.log( obj.constructor == Array ) // falseconsole.log( typeof obj ) // objectconsole.log( typeof arr ) // object