在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===false
或typeof 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名称
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()
速度较慢,但速度并不慢。 我对parseInt
和parseFloat
抱有很高的期望,但是他们的速度非常慢。
为了检测数字,下面是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