【问题标题】:How to write isNumber() in JavaScript? [duplicate]如何在 JavaScript 中编写 isNumber()? [复制]
【发布时间】:2013-12-08 18:30:15
【问题描述】:

我的猜测是:

function isNumber(val) {
    return val === +val;
}

有没有更好的办法?

以前的参考文献

Validate decimal numbers in JavaScript - IsNumeric()

【问题讨论】:

  • 您对以下值的期望是什么:NaNInfinity'1'1
  • 你可以使用 jQuery 的实现:jQuery.isNumeric
  • 数学中的实数。
  • 我只需要问一下,您不能在您自己在问题中发布的完全相同的问题中找到答案吗?
  • “这不能处理负数”是什么意思? -1 等于 +-1

标签: javascript


【解决方案1】:
var isNumber = function isNumber(value) 
{
   return typeof value === 'number' && isFinite(value);
}

以上代码摘自《JavaScript - 优秀部分》一书。

/* ANSWER UPDATE BEGIN - 回复一些 cmets
以下来自提出问题的人和其他人*/

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

var isNumberObject = function isNumberObject(n) {
  return (Object.prototype.toString.apply(n) === '[object Number]');
}

var isCustomNumber = function isCustomNumber(n){
  return isNumber(n) || isNumberObject(n);
}

console.log(isCustomNumber(new Number(5)));
console.log(isCustomNumber(new Number(5.2)));
console.log(isCustomNumber(new Number(5.5)));
console.log(isCustomNumber(new Number(-1)));
console.log(isCustomNumber(new Number(-1.5)));
console.log(isCustomNumber(new Number(-0.0)));
console.log(isCustomNumber(new Number(0.0)));
console.log(isCustomNumber(new Number(0)));
console.log(isCustomNumber(new Number(1e5)));

console.log(isCustomNumber(5));
console.log(isCustomNumber(5.2));
console.log(isCustomNumber(5.5));
console.log(isCustomNumber(-1));
console.log(isCustomNumber(-1.5));
console.log(isCustomNumber(-0.0));
console.log(isCustomNumber(0.0));
console.log(isCustomNumber(0));
console.log(isCustomNumber(1e5));

/* ANSWER UPDATE END - 回复一些 cmets
以下来自提出问题的人和其他人*/

【讨论】:

  • 我喜欢 typeof 但 isFinite 有什么用?
  • "isFinite 函数是确定一个值是否可以用作数字的最佳方法,因为它拒绝 NaN 和 Infinity。"这也是同一本书的引述。
  • 为什么使用命名函数表达式?
  • @Givi:很可能是这样的,类似于原生函数,名称显示在它的toString 表示中。
  • 我在回答中引用的这项检查尽可能严格。这是一本书的报价。对象 new Number(5) 不是 JS 中的数字,这很明显。因此,如果您想为特殊目的自定义此检查 - 请随意。我对实现该自定义定义的最佳猜测就在那里 - 请参阅我的答案的更新(我认为这个扩展遵循了这本书的理念,我非常喜欢这本书,因为作者真的很清楚他在说什么)。
【解决方案2】:

如果您不想包含字符串,但确实想要包含 Infinity, 您可以将参数的数字强制与参数进行比较:

function isNumber(n){
    return Number(n)=== n;
}

//测试

[0, 1, 2, -1, 1.345e+17, Infinity, false, true, NaN, '1', '0'].map(function(itm){
    return itm+'= '+isNumber(itm);
});

// returned values
0= true
1= true
2= true
-1= true
134500000000000000= true
Infinity= true
false= false
true= false
NaN= false
'1'= false
'0'= false

【讨论】:

  • 你考虑01数字吗?如果是这样,那这种情况就失败了
【解决方案3】:

我喜欢这个解决方案:

function isNumber(val) {
    return (val >=0 || val < 0);
}

【讨论】:

  • 检测真假。
  • 好吧,既然 true 和 false 可以被视为 1 或 0,我想这是一个理想的功能。
  • "can be seen as" 和 "is" 是两个非常不同的东西。当您的函数为布尔值返回 true 时会发生什么,因此您尝试在 val 上调用 Number.prototype 方法?糟糕!
【解决方案4】:
function isNumber(val) {
        // negative or positive
        return /^[-]?\d+$/.test(val);
    }

【讨论】:

  • 1.1 会失败,这是故意的吗?
  • ...你能破解 Joren 的答案吗?
  • 我觉得他的解决方案还可以
【解决方案5】:

如果你希望"23" 是一个数字,那么

function isNumber(val) {
    return !isNaN(val);
}

【讨论】:

  • 上面的函数会给出错误的 null 和空字符串,使用下面的正确的一个函数 isNumber(n) { return !n && isFinite(n) }
  • 当 val 为空字符串时返回 true。但很好很简单的答案。
【解决方案6】:
function isNumber(val){
    return typeof val==='number';
}

【讨论】:

  • 当然还有&amp;&amp; !isNaN(val),因为typeof NaN是数字。
  • @FarzadYousefzadeh 直到“非数字”属于“数字”类型。一定要爱上 javascript。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 2019-09-30
  • 2014-04-06
  • 2020-10-26
  • 1970-01-01
  • 2010-10-29
  • 2013-08-05
相关资源
最近更新 更多