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


当前回答

你觉得这个怎么样?

const numberOrString='10' 
const isNumber = !isNaN(numberOrString*1) 

其他回答

类型检查

你可以使用typeof操作符检查变量的类型:

typeof variable

值检查

下面的代码对数字返回true,对其他任何值返回false:

!isNaN(+variable);

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

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

如果你处理的是文字符号,而不是构造函数,你可以使用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

对于数字检测,以下文章来自Douglas Crockford的JavaScript: the Good Parts:

isFinite函数是确定一个值是否可以用作数字的最佳方法,因为它拒绝NaN和Infinity。不幸的是,isFinite将尝试将其操作数转换为一个数字,因此如果一个值实际上不是一个数字,那么它不是一个好的测试。你可能想要定义自己的isNumber函数:

var isNumber = function isNumber(value) { return typeof value === 'number' &&
            isFinite(value);
};

我发现的同时考虑正数和负数的最好方法是: 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;

}