有人知道如何在JavaScript中检查变量是数字还是字符串吗?
当前回答
最好的方法是使用isNaN +类型转换:
更新的all-in方法:
function isNumber(n) { return !isNaN(parseFloat(n)) && !isNaN(n - 0) }
使用regex也一样:
function isNumber(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n); }
------------------------
isNumber('123'); // true
isNumber('123abc'); // false
isNumber(5); // true
isNumber('q345'); // false
isNumber(null); // false
isNumber(undefined); // false
isNumber(false); // false
isNumber(' '); // false
其他回答
效率测试
我知道我该怎么用…
isNaN(parseFloat(n)) && !isNaN(n - 0)} 函数isNumberRE (n){返回/ ^ - ? (\ d。)+ (?:e - ? \ d +) ?美元/ test (n);} function test(fn, timerLabel) { console.time (timerLabel) For (i = 0;I < 1000000;我+ +){ const num = Math.random() * 100 const isNum = fn(num) } console.timeEnd (timerLabel) } test(isNumber, "Normal way") test(isNumberRE, "RegEx方式")
Normal way: 25.103271484375 ms
RegEx way: 334.791015625 ms
我认为将var转换为字符串会降低性能,至少在最新的浏览器中进行的测试显示了这一点。
如果你关心性能,我会用这个:
typeof str === "string" || str instanceof String
用于检查变量是否为字符串(即使您使用var str = new string ("foo"), str instanceof string将返回true)。
至于检查它是否是一个数字,我会选择本地:isNaN;函数。
像其他人一样,我沉迷于强类型(即使我喜欢JS)
在我的代码中,我碰巧需要区分数字和字符串,来执行两种截然不同的操作。
而不是高谈阔论:
让int = 123, STR = '123'; console.log (int。构造函数===Number, str.constructor===String);// true true Console.log (typeof int === 'number', typeof STR === 'number');// true false console.log (Number(int)== int, Number(str)===str) // true false //或 console.log (String(int)== int, String(str)===str) // false true //最短的: Console.log (+int== int, +str== str);// true false
因此我主要使用,特别是在三元测试中。
let res = (+X===X) ? stuff_to_do_with_a_Number(X) : stuff_to_do_with_a_String(X);
当然,这必须小心处理。
创建了一个jsperf,用于检查变量是否为数字。很有趣!Typeof实际上有一个性能用途。对于数字以外的任何东西使用typeof,通常以速度的1/3作为变量。构造函数,因为javascript中的大多数数据类型都是对象;数字不是!
http://jsperf.com/jemiloii-fastest-method-to-check-if-type-is-a-number
Typeof变量=== 'number'|最快|如果你想要一个数字,比如5,而不是'5' typeof parseFloat(variable) === 'number'|最快|如果你想要一个数字,比如5,和'5'
isNaN()比较慢,但也没慢那么多。我对parseInt和parseFloat寄予厚望,但它们的速度慢得可怕。
下面是一种基于通过添加零或空字符串将输入强制为数字或字符串的方法,然后进行类型化的相等比较。
function is_number(x) { return x === x+0; }
function is_string(x) { return x === x+""; }
由于一些无法理解的原因,x===x+0似乎比x===+x执行得更好。
有没有失败的情况?
同样地:
function is_boolean(x) { return x === !!x; }
这似乎比x===true || x===false或typeof x==="boolean"稍微快(并且比x=== boolean (x)快得多)。
然后还有
function is_regexp(x) { return x === RegExp(x); }
所有这些都依赖于特定于每种类型的“标识”操作的存在,该操作可以应用于任何值,并可靠地产生有关类型的值。我想不出这样的操作日期。
对于NaN来说,有
function is_nan(x) { return x !== x;}
这基本上是下划线的版本,它的速度大约是isNaN()的四倍,但下划线源代码中的注释提到“NaN是唯一不等于自身的数字”,并添加了_.isNumber检查。为什么?还有什么物体不与它们相等呢?同样,下划线使用x !== +x——但是这里的+有什么区别呢?
对于偏执狂来说:
function is_undefined(x) { return x===[][0]; }
或者这个
function is_undefined(x) { return x===void(0); }