在JavaScript中查找variablestypes

在Java中,您可以在variables上使用instanceOfgetClass()来查找其types。

如何在JavaScript中find一个非强types的variablestypes?

例如,我怎么知道如果barBoolean或一个Number ,或一个String

 function foo(bar) { // what do I do here? } 

使用typeof

 > typeof "foo" "string" > typeof true "boolean" > typeof 42 "number" 

所以你可以这样做:

 if(typeof bar === 'number') { //whatever } 

要小心,如果你定义这些原语与他们的对象包装(你永远不应该做,尽可能使用文字):

 > typeof new Boolean(false) "object" > typeof new String("foo") "object" > typeof new Number(42) "object" 

数组的types仍然是object 。 在这里你真的需要instanceof操作符。

更新:

另一个有趣的方法是检查Object.prototype.toString的输出:

 > Object.prototype.toString.call([1,2,3]) "[object Array]" > Object.prototype.toString.call("foo bar") "[object String]" > Object.prototype.toString.call(45) "[object Number]" > Object.prototype.toString.call(false) "[object Boolean]" > Object.prototype.toString.call(new String("foo bar")) "[object String]" 

因此,您不必区分原始值和对象。

typeof只适用于返回“原始”types,数字,布尔值,对象,string和符号。 你也可以使用instanceof来testing一个对象是否是特定的types。

 function MyObj(prop) { this.prop = prop; } var obj = new MyObj(10); console.log(obj instanceof MyObj && obj instanceof Object); // outputs true 

使用type

 // Numbers typeof 37 === 'number'; typeof 3.14 === 'number'; typeof Math.LN2 === 'number'; typeof Infinity === 'number'; typeof NaN === 'number'; // Despite being "Not-A-Number" typeof Number(1) === 'number'; // but never use this form! // Strings typeof "" === 'string'; typeof "bla" === 'string'; typeof (typeof 1) === 'string'; // typeof always return a string typeof String("abc") === 'string'; // but never use this form! // Booleans typeof true === 'boolean'; typeof false === 'boolean'; typeof Boolean(true) === 'boolean'; // but never use this form! // Undefined typeof undefined === 'undefined'; typeof blabla === 'undefined'; // an undefined variable // Objects typeof {a:1} === 'object'; typeof [1, 2, 4] === 'object'; // use Array.isArray or Object.prototype.toString.call to differentiate regular objects from arrays typeof new Date() === 'object'; typeof new Boolean(true) === 'object'; // this is confusing. Don't use! typeof new Number(1) === 'object'; // this is confusing. Don't use! typeof new String("abc") === 'object'; // this is confusing. Don't use! // Functions typeof function(){} === 'function'; typeof Math.sin === 'function'; 

在Javascript中,你可以通过使用typeof函数来实现

 function foo(bar){ alert(typeof(bar)); } 

要比其他答案(有些人可能会说迂腐)更精确一些ECMAScript-5.1:

在JavaScript中,variables(和属性)没有types:值。 此外,只有6种types的值:未定义,空值,布尔值,string,数字和对象。 (从技术上讲,也有7个“规范types”,但不能将这些types的值作为对象的属性或variables的值存储 – 只能在规范本身内部使用,以定义语言的工作方式。你可以明确地操作只有我列出的6种types。)

当它想要谈论“x的types”时,规范使用符号“Type(x)”。 这只是规范中使用的符号:它不是该语言的一个特征。

正如其他答案所表明的那样,在实践中,你可能想知道的不仅仅是一个值的types – 特别是当这个types是Object的时候。 无论如何,为了完整起见,下面是在规范中使用的types(x)的简单JavaScript实现:

 function Type(x) { if (x === null) { return 'Null'; } switch (typeof x) { case 'undefined': return 'Undefined'; case 'boolean' : return 'Boolean'; case 'number' : return 'Number'; case 'string' : return 'String'; default : return 'Object'; } } 

我觉得这种types是如此有限的令人沮丧。 这是一个改进的版本:

 var realtypeof = function (obj) { switch (typeof(obj)) { // object prototypes case 'object': if (obj instanceof Array) return '[object Array]'; else if (obj instanceof Date) return '[object Date]'; else if (obj instanceof RegExp) return '[object regexp]'; else if (obj instanceof String) return '[object String]'; else if (obj instanceof Number) return '[object Number]'; else return 'object'; // object literals default: return typeof(obj); } }; 

样品testing:

 realtypeof( '' ) // "string" realtypeof( new String('') ) // "[object String]" Object.prototype.toString.call("foo bar") //"[object String]" 

这是完整的解决scheme。

您也可以将其用作项目中的助手类。

 "use strict"; /** * @description Util file * @author Tarandeep Singh * @created 2016-08-09 */ window.Sys = {}; Sys = { isEmptyObject: function(val) { return this.isObject(val) && Object.keys(val).length; }, /** This Returns Object Type */ getType: function(val) { return Object.prototype.toString.call(val); }, /** This Checks and Return if Object is Defined */ isDefined: function(val) { return val !== void 0 || typeof val !== 'undefined'; }, /** Run a Map on an Array **/ map: function(arr, fn) { var res = [], i = 0; for (; i < arr.length; ++i) { res.push(fn(arr[i], i)); } arr = null; return res; }, /** Checks and Return if the prop is Objects own Property */ hasOwnProp: function(obj, val) { return Object.prototype.hasOwnProperty.call(obj, val); }, /** Extend properties from extending Object to initial Object */ extend: function(newObj, oldObj) { if (this.isDefined(newObj) && this.isDefined(oldObj)) { for (var prop in oldObj) { if (this.hasOwnProp(oldObj, prop)) { newObj[prop] = oldObj[prop]; } } return newObj; } else { return newObj || oldObj || {}; } } }; // This Method will create Multiple functions in the Sys object that can be used to test type of ['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Object', 'Array', 'Undefined'] .forEach( function(name) { Sys['is' + name] = function(obj) { return toString.call(obj) == '[object ' + name + ']'; }; } ); 
 <h1>Use the Helper JavaScript Methods..</h1> <code>use: if(Sys.isDefined(jQuery){console.log("O Yeah... !!");}</code>