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


当前回答

哦?使用正则表达式!:)

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

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

其他回答

简单而彻底:

function isNumber(x) {
  return parseFloat(x) == x
};

测试用例:

console.log('***TRUE CASES***');
console.log(isNumber(0));
console.log(isNumber(-1));
console.log(isNumber(-500));
console.log(isNumber(15000));
console.log(isNumber(0.35));
console.log(isNumber(-10.35));
console.log(isNumber(2.534e25));
console.log(isNumber('2.534e25'));
console.log(isNumber('52334'));
console.log(isNumber('-234'));
console.log(isNumber(Infinity));
console.log(isNumber(-Infinity));
console.log(isNumber('Infinity'));
console.log(isNumber('-Infinity'));

console.log('***FALSE CASES***');
console.log(isNumber(NaN));
console.log(isNumber({}));
console.log(isNumber([]));
console.log(isNumber(''));
console.log(isNumber('one'));
console.log(isNumber(true));
console.log(isNumber(false));
console.log(isNumber());
console.log(isNumber(undefined));
console.log(isNumber(null));
console.log(isNumber('-234aa'));

因为像'1234'这样带有typeof的字符串将显示'string',而相反的情况永远不会发生(typeof 123将始终是number),最好是使用简单的正则表达式/^\-?\d+$/.test(var)。或者更高级的浮点数、整数和负数匹配,/^[\-\+]?[\d]+\.?(\d+)?美元/ .test的重要方面是,如果var不是字符串,它不会抛出异常,值可以是任何东西。

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 

如果您正在寻找真正的类型,那么typeof单独就可以了。

呃,不如这样:

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

经过几个月后的进一步检查,这只能保证obj是一个定义了方法或属性名称toLowerCase的对象。我为我的回答感到惭愧。请参阅投票最多的类型。

下面是一种基于通过添加零或空字符串将输入强制为数字或字符串的方法,然后进行类型化的相等比较。

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); }

我认为将var转换为字符串会降低性能,至少在最新的浏览器中进行的测试显示了这一点。

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

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

用于检查变量是否为字符串(即使您使用var str = new string ("foo"), str instanceof string将返回true)。

至于检查它是否是一个数字,我会选择本地:isNaN;函数。