有人知道如何在JavaScript中检查变量是数字还是字符串吗?
当前回答
我认为将var转换为字符串会降低性能,至少在最新的浏览器中进行的测试显示了这一点。
如果你关心性能,我会用这个:
typeof str === "string" || str instanceof String
用于检查变量是否为字符串(即使您使用var str = new string ("foo"), str instanceof string将返回true)。
至于检查它是否是一个数字,我会选择本地:isNaN;函数。
其他回答
如果你处理的是文字符号,而不是构造函数,你可以使用typeof:。
typeof "Hello World"; // string
typeof 123; // number
如果你通过构造函数创建数字和字符串,比如var foo = new String("foo"),你应该记住typeof可能会返回foo的对象。
也许一个更简单的检查类型的方法是利用underscore.js中的方法(带注释的源代码可以在这里找到),
var toString = Object.prototype.toString;
_.isString = function (obj) {
return toString.call(obj) == '[object String]';
}
这将返回一个布尔值true:
_.isString("Jonathan"); // true
_.isString(new String("Jonathan")); // true
这个解决方案解决了这里提出的许多问题!
这是迄今为止我用过的最可靠的方法。这不是我发明的,也不记得我最初是在哪里找到它的。但它在其他技术失败的地方奏效:
// 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"
异或操作可用于检测数字或字符串。 Number ^ 0将始终以相同的数字作为输出,而string ^ 0将以0作为输出。
Example:
1) 2 ^ 0 = 2
2) '2' ^ 0 = 2
3) 'Str' ^ 0 = 0
效率测试
我知道我该怎么用…
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
聚会很晚才来;然而,当我想一次性检查某些输入是字符串还是数字时,下面的方法总是很有效。
return !!Object.prototype.toString.call(input).match(/\[object (String|Number)\]/);