在 JavaScript 中检查变量是数字还是字符串

IT技术 javascript types
2021-01-20 12:52:39

有谁知道如何在 JavaScript 中检查变量是数字还是字符串?

6个回答

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

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

如果您通过构造函数创建数字和字符串,例如var foo = new String("foo"),您应该记住,typeof可能会返回objectfor 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
是的,但是无论如何您想使用 String 对象吗?
2021-03-14 12:52:39
当然,但是说我有函数 isString(str) { return typeof str === 'string' } 一些 Java 转换可以使用我的方法,所以var myString = new String("stuff I like"); isString(myString)这会返回 false。另外,我不确定背景转换持续多长时间,我知道当我调用“hi”.length时,“hi”被转换成一个对象,不知道它多久会再次转换回来或者是否曾经被绑定到变量。
2021-03-20 12:52:39
分别表示“字符串”和“数字”
2021-03-27 12:52:39
@George 根据 OP,只会测试现有变量。
2021-03-27 12:52:39
这是不正确的!字符串有两种可能的表示形式。alert(typeof new String()) 将输出“对象”。更糟糕的是,出于优化目的,javascript 偶尔会在幕后的两种表示之间来回转换
2021-04-06 12:52:39

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

更新 all-in 方法:

function isNumber(n) { return !isNaN(parseFloat(n)) && !isNaN(n - 0) }

同样使用正则表达式:

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
怎么了 function is_number(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n);}
2021-03-16 12:52:39
@ash 谢谢,我已经更新了解决方案来涵盖这种情况。
2021-03-24 12:52:39
对于诸如“123abc”之类的字符串,这也失败。
2021-04-01 12:52:39
仅供参考:null被强制为 0 并返回 true forisNumber(null);
2021-04-04 12:52:39
如果您想计算解析为有效数字的字符串,这看起来是一个很好的解决方案。
2021-04-09 12:52:39

我发现的最好方法是检查字符串上的方法,即:

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

或者如果您想对数字属性进行数字检查,

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

这有点像“鸭子打字”,这取决于您哪种方式最有意义。我没有足够的 karma 来评论,但 typeof 对盒装字符串和数字失败,即:

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

会提醒“对象”。

我发现这比typeof它总是可以测试字符串更好,无论是原始字符串还是字符串对象。您只需要测试对您想要的类型来说是唯一的方法。
2021-03-25 12:52:39
我喜欢这种鸭子打字的想法,但对于像{substring:"hello"}. 我知道出于我的目的,我只是测试了我需要做的特定操作(模数)对我需要检查的类型(字符串模数返回未定义)做了什么,然后检查了它而不是获取它的类型。
2021-03-25 12:52:39
@Lemmings19 它实际上并没有调用 substring 方法,它只检查 x 是否有 substring 方法。
2021-04-07 12:52:39
从必须维护代码的人的角度来看,选择这条路径可能会令人困惑。“为什么他们使用子字符串而不传递任何值?我在这里缺少什么业务逻辑?” 至少,这需要与解释所涉及逻辑的注释配对。
2021-04-08 12:52:39

您正在寻找isNaN()

console.log(!isNaN(123));
console.log(!isNaN(-1.23));
console.log(!isNaN(5-2));
console.log(!isNaN(0));
console.log(!isNaN("0"));
console.log(!isNaN("2"));
console.log(!isNaN("Hello"));
console.log(!isNaN("2005/12/12"));

请参阅MDN 上的JavaScript isNaN() 函数

请记住,isNaN返回falsefor null(but truefor undefined)。
2021-03-16 12:52:39
我觉得奇怪的是,他们会为方法名称选择逆运算。调用 isNumber() 似乎更直观。
2021-03-19 12:52:39
我刚刚用“25”进行了测试,结果返回 false - 正如我所期望的。
2021-03-22 12:52:39
它实际上不是“isNumber”的逆运算。NaN 是 JavaScript 中数字的特殊值。isNaN 将提供给它的所有内容转换为数字并检查结果是否为 NaN。对于像“25”这样的字符串,您会得到不正确的结果。
2021-03-30 12:52:39
NaN 是 IEEE 754 二进制浮点运算标准中的一个特殊值,而不仅仅是 JavaScript 的东西。(嗯,准确地说:“IEEE 标准的 9007199254740990(即 (2^53)-2)个不同的“非数字”值在 ECMAScript 中表示为单个特殊 NaN 值。”
2021-03-30 12:52:39

从 ES2015 开始,检查变量是否包含有效数字的正确方法是 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
不适用于字符串,这是原始问题。
2021-03-14 12:52:39
这给出了问题的部分答案 - 但它是非常好的部分答案 - 三角形
2021-03-17 12:52:39
这是一个伟大而简单的答案!
2021-03-28 12:52:39
2021-04-09 12:52:39