在JavaScript中检查variables是数字还是string

有谁知道我怎么能检查一个variables是一个数字或JavaScript中的string?

如果你正在处理文字符号,而不是构造函数,你可以使用typeof:。

typeof "Hello World"; // string typeof 123; // number 

如果你通过构造函数创build数字和string,比如var foo = new String("foo") ,你应该记住typeof可能会返回foo object

也许一个更加简单的检查types的方法是使用underscore.js中的方法(注释源可以在这里find),

 var toString = Object.prototype.toString; _.isString = function (obj) { return toString.call(obj) == '[object String]'; } 

这将为以下内容返回一个布尔值true

 _.isString("Jonathan"); // true _.isString(new String("Jonathan")); // true 

最好的方法是使用isNaN +types转换:

全更新的方法更新:

 function isNumber(obj) { return !isNaN(parseFloat(obj)) } 

使用正则expression式相同:

 function isNumber(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n); } ------------------------ isNumber ('123'); // true isNumber (5); // true isNumber ('q345'); // false isNumber(null); // false isNumber(undefined); // false isNumber(false); // false isNumber(' '); // false 

编辑:

如果你需要处理null值:

 function isNumber (o) { return ! isNaN (o-0) && o != null; } 

编辑2(更新):如果你需要处理null和空string:

 function isNumber (o) { return ! isNaN (o-0) && o !== null && o !== "" && o !== false; } isNumber (''); // false 

我发现的最好的方法是检查string上的方法,即:

 if (x.substring) { // do string thing } else{ // do other thing } 

或者如果你想用数字检查一个数字属性,

 if (x.toFixed) { // do number thing } else { // do other thing } 

这就像“鸭子打字”,这取决于你最有意义的方式。 我没有足够的业力评论,但typeof失败的盒装string和数字,即:

 alert(typeof new String('Hello World')); alert(typeof new Number(5)); 

将提醒“对象”。

检查值是一个string文字还是string对象:

 function isString(o) { return typeof o == "string" || (typeof o == "object" && o.constructor === String); } 

unit testing:

 function assertTrue(value, message) { if (!value) { alert("Assertion error: " + message); } } function assertFalse(value, message) { assertTrue(!value, message); } assertTrue(isString("string literal"), "number literal"); assertTrue(isString(new String("String object")), "String object"); assertFalse(isString(1), "number literal"); assertFalse(isString(true), "boolean literal"); assertFalse(isString({}), "object"); 

检查号码是类似的:

 function isNumber(o) { return typeof o == "number" || (typeof o == "object" && o.constructor === Number); } 

你正在寻找isNaN():

 <script type="text/javascript"> alert(isNaN(123)); alert(isNaN(-1.23)); alert(isNaN(5-2)); alert(isNaN(0)); alert(isNaN("Hello")); alert(isNaN("2005/12/12")); </script> 

请参阅MDN中的JavaScript isNaN()函数 。

尝试这个,

 <script> var regInteger = /^\d+$/; function isInteger( str ) { return regInteger.test( str ); } if(isInteger("1a11")) { console.log( 'Integer' ); } else { console.log( 'Non Integer' ); } </script> 
 //testing data types accurately in JavaScript (opposed to "typeof") //from http://bonsaiden.github.com/JavaScript-Garden/ function is(type, obj) { var clas = Object.prototype.toString.call(obj).slice(8, -1); return obj !== undefined && obj !== null && clas === type; } //basic usage is('String', 'test'); // true is('Array', true); // false 

或者适应它返回一个未知的types:

 function realTypeOf(obj) { return Object.prototype.toString.call(obj).slice(8, -1); } //usage realTypeOf(999); // 'Number' 

2012年5月12日更新:使用 Javascript的完整示例:更好的types 。

最好的方法来做到这一点:

 function isNumber(num) { return (typeof num == 'string' || typeof num == 'number') && !isNaN(num - 0) && num !== ''; }; 

这满足以下testing用例:

 assertEquals("ISNUMBER-True: 0", true, isNumber(0)); assertEquals("ISNUMBER-True: 1", true, isNumber(-1)); assertEquals("ISNUMBER-True: 2", true, isNumber(-500)); assertEquals("ISNUMBER-True: 3", true, isNumber(15000)); assertEquals("ISNUMBER-True: 4", true, isNumber(0.35)); assertEquals("ISNUMBER-True: 5", true, isNumber(-10.35)); assertEquals("ISNUMBER-True: 6", true, isNumber(2.534e25)); assertEquals("ISNUMBER-True: 7", true, isNumber('2.534e25')); assertEquals("ISNUMBER-True: 8", true, isNumber('52334')); assertEquals("ISNUMBER-True: 9", true, isNumber('-234')); assertEquals("ISNUMBER-False: 0", false, isNumber(NaN)); assertEquals("ISNUMBER-False: 1", false, isNumber({})); assertEquals("ISNUMBER-False: 2", false, isNumber([])); assertEquals("ISNUMBER-False: 3", false, isNumber('')); assertEquals("ISNUMBER-False: 4", false, isNumber('one')); assertEquals("ISNUMBER-False: 5", false, isNumber(true)); assertEquals("ISNUMBER-False: 6", false, isNumber(false)); assertEquals("ISNUMBER-False: 7", false, isNumber()); assertEquals("ISNUMBER-False: 8", false, isNumber(undefined)); assertEquals("ISNUMBER-False: 9", false, isNumber(null)); 

从ES2015开始,检查一个variables是否有效的正确方法是:

 Number.isFinite(value) 

例子:

 Number.isFinite(Infinity) // false Number.isFinite(NaN) // false Number.isFinite(-Infinity) // false Number.isFinite(0) // true Number.isFinite(2e64) // true Number.isFinite('0') // false Number.isFinite(null) // false 

下面是基于强制input数字或string的方法,方法是添加零或空string,然后进行types相等比较。

 function is_number(x) { return x === x+0; } function is_string(x) { return x === x+""; } 

由于一些深不可测的原因, x===x+0似乎performance比x===+x更好。

有没有这种情况下失败?

同样的道理:

 function is_boolean(x) { return x === !!x; } 

这似乎比x===true || x===false稍微快一些 x===true || x===falsetypeof x==="boolean" (比x===Boolean(x)快得多)。

那么也有

 function is_regexp(x) { return x === RegExp(x); } 

所有这些都取决于每种types所特有的“身份”操作的存在,这种操作可以应用于任何值,并可靠地生成所讨论types的值。 我不能想到这样的date操作。

对于NaN,有

 function is_nan(x) { return x !== x;} 

这基本上是下划线的版本,因为它比isNaN()快大约四倍,但下划线源中的注释提到“NaN是唯一不等于自身的数字”,并添加了对_.isNumber的检查。 为什么? 还有什么其他的东西不等于自己呢? 另外,下划线使用x !== +x但是这里的+什么区别呢?

那么对于偏执狂来说:

 function is_undefined(x) { return x===[][0]; } 

你能把它除以1吗?

我认为这个问题是一个stringinput,如:“123ABG”

 var Check = "123ABG" if(Check == Check / 1) { alert("This IS a number \n") } else { alert("This is NOT a number \n") } 

只是我最近做的一个方法。

呃,怎么样只是:

 function IsString(obj) { return obj !== undefined && obj != null && obj.toLowerCase !== undefined; } 

经过几个月后的进一步审查,这只保证obj是具有方法或属性名称toLowerCase定义的对象。 我对我的回答感到羞愧。 请参阅最受欢迎的types之一。

我认为将var转换为string会降低性能,至less在最新的浏览器中执行的testing显示如此。

所以如果你关心性能,我会用这个:

 typeof str === "string" || str instanceof String 

检查variables是否是string(即使使用var str = new String("foo")str instanceof String也会返回true)。

至于检查是否是一个数字,我会去为本地: isNaN ; function。

这个解决scheme解决了这里提出的许多问题!

这是迄今为止我所使用的最可靠的方法。 我没有发明这个,也不记得我最初发现它的地方。 但是在其他技术失败的情况下,

 // Begin public utility /getVarType/ // Returns 'Function', 'Object', 'Array', // 'String', 'Number', 'Boolean', or 'Undefined' getVarType = function ( data ){ if (undefined === data ){ return 'Undefined'; } if (data === null ){ return 'Null'; } return {}.toString.call(data).slice(8, -1); }; // End public utility /getVarType/ 

正确性的例子

 var str = new String(); console.warn( getVarType(str) ); // Reports "String" console.warn( typeof str ); // Reports "object" var num = new Number(); console.warn( getVarType(num) ); // Reports "Number" console.warn( typeof num ); // Reports "object" var list = []; console.warn( getVarType( list ) ); // Reports "Array" console.warn( typeof list ); // Reports "object" 

或者只是使用isNaN的反转

如果(!isNaN(data))对数字做了一些事情,它是一个string

是的 – 使用jQuery – $ .isNumeric()是更有趣的降压。

我发现最好的方式也认为正面和负面的数字是从: O'Reilly Javascript和DHTML食谱 :

 function isNumber(elem) { var str = elem.value; var oneDecimal = false; var oneChar = 0; // make sure value hasn't cast to a number data type str = str.toString( ); for (var i = 0; i < str.length; i++) { oneChar = str.charAt(i).charCodeAt(0); // OK for minus sign as first character if (oneChar = = 45) { if (i = = 0) { continue; } else { alert("Only the first character may be a minus sign."); return false; } } // OK for one decimal point if (oneChar = = 46) { if (!oneDecimal) { oneDecimal = true; continue; } else { alert("Only one decimal is allowed in a number."); return false; } } // characters outside of 0 through 9 not OK if (oneChar < 48 || oneChar > 57) { alert("Enter only numbers into the field."); return false; } } return true; 

}

Errr? 只要使用正则expression式! 🙂

 function isInteger(val) { return val.match(/^[0-9]$/) } function isFloat(val) { return val.match(/^[0-9]*/\.[0-9]+$/) } 

因为一个带有typeof的string“1234”将会显示“string”,并且反过来也不会发生(typeof 123将始终是数字),所以最好使用一个简单的正则expression式/^\-?\d+$/.test(var) 。 或者更高级的匹配浮动,整数和负数,/ /^[\-\+]?[\d]+\.?(\d+)?$/ .?( /^[\-\+]?[\d]+\.?(\d+)?$/ / .test的重要一面是它不会抛出如果var不是一个string,则该值可以是任何值。

 var val, regex = /^[\-\+]?[\d]+\.?(\d+)?$/; regex.test(val) // false val = '1234'; regex.test(val) // true val = '-213'; regex.test(val) // true val = '-213.2312'; regex.test(val) // true val = '+213.2312'; regex.test(val) // true val = 123; regex.test(val) // true val = new Number(123); regex.test(val) // true val = new String('123'); regex.test(val) // true val = '1234e'; regex.test(val) // false val = {}; regex.test(val) // false val = false; regex.test(val) // false regex.test(undefined) // false regex.test(null) // false regex.test(window) // false regex.test(document) // false 

如果你正在寻找真正的types,那么typeof就可以做到。

@ BitOfUniverse的答案是好的,我想出了一个新的方法:

 function isNum(n) { return !isNaN(n/0); } isNum('') // false isNum(2) // true isNum('2k') // false isNum('2') //true 

我知道0不能被分红,但在这里function完美。

在大多数情况下,typeof对我来说工作得非常好。 你可以尝试使用if语句

 if(typeof x === 'string' || typeof x === 'number') { console.log("Your statement"); } 

其中x是您select的任何variables名称

只是一个FYI,如果你使用jQuery你有

 $.isNumeric() 

来处理这个。 有关http://api.jquery.com/jQuery.isNumeric/的更多详细信息;

jQuery使用这个:

 function isNumber(obj) { return !isNaN( parseFloat( obj ) ) && isFinite( obj ); } 

简单的使用

 myVar.constructor == String 

要么

 myVar.constructor == Number 

如果你想处理定义为对象或文字的string,并保存你不想使用帮助函数。

 function IsNumeric(num) { return ((num >=0 || num < 0)&& (parseInt(num)==num) ); } 

晚会很晚; 但是,当我想要检查一些input是一个string还是一个数字时,以下对我来说总是奏效。

 return !!Object.prototype.toString.call(input).match(/\[object (String|Number)\]/); 

创build一个jsperf来检查一个variables是否是一个数字。 很有趣! typeof实际上有一个性能用途。 因为javascript中的大多数数据types都是对象,所以对于数字以外的任何其他types使用typeof通常会以1/3的速度作为variable.constructor 。 数字不是!

http://jsperf.com/jemiloii-fastest-method-to-check-if-type-is-a-number

typeof variable === 'number' | 最快| 如果你想要一个数字,比如5,而不是'5'
typeof parseFloat(variable) === 'number' | 最快| 如果你想要一个数字,比如5和'5'

isNaN()速度较慢,但​​速度并不慢。 我对parseIntparseFloat抱有很高的期望,但是他们的速度非常慢。

为了检测数字,下面是JavaScript的一段话:道格拉斯·克罗克福德的好作品是相关的:

isFinite函数是确定一个值是否可以用作数字的最好方法,因为它拒绝了NaN和Infinity。 不幸的是,isFinite将尝试将其操作数转换为数字,所以如果一个值实际上不是一个数字,那么这个testing并不是一个好的testing。 你可能想要定义你自己的isNumber函数:

 var isNumber = function isNumber(value) { return typeof value === 'number' && isFinite(value); }; 

这里是如何在AngularJS中实现isString:

 function isString(value) {return typeof value === 'string';} 

您也可以使用这两个is-string和is-number开源组件来完成工作而不需要重复。

例子:

  isString(3) // => false isString('') // => true 

和:

  isNumber('') // => false