首页 > 编程语言 >[转]JavaScript 判断是否为数字的几种方式

[转]JavaScript 判断是否为数字的几种方式

时间:2024-01-30 10:49:24浏览次数:21  
标签:isNaN false 数字 JavaScript Number value 几种 true isFinite

原文地址:JavaScript 判断是否为数字的几种方式_js 判断是否是数字-CSDN博客

前言

js判断是否为数字的方式很多:

  1. typeof、instanceof、Number.isNumber
  2. parseInt、parseFloat
  3. isNaN、isFinite
  4. Number.isNaN、Number.isFinite
  5. 正则表达式
  6. 终极方案

我们逐一介绍,希望能帮到大家。

1. typeof、instanceof、Number.isInteger

typeof判断值是不是基本类型number,比如:

1 2 let num = 1; typeof num === 'number'; // true

instanceof判断值是不是包装类Number,比如:

1 2 let num = new Number(1); num instanceof Number; // true

Number.isInteger判断值是否是整数:

1 2 3 Number.isInteger(1);   // true Number.isInteger('1'); // false Number.isInteger(1.1); // false

这几种方式的缺点,都是只能基于类型判断,无法判断字符串是否是数值。

2. parseInt、parseFloat

这个方法的特点,一句话,返回字符串开头最长的有效数字。

我们可以用!isNaN(parseFloat(value))来判断字符串是否是数值。

1 2 3 4 let str1 = '123'; let str2 = 'abc'; !isNaN(parseFloat(str1)); // true,是数字 !isNaN(parseFloat(str2)); // false,不是数字

parseInt和parseFloat解析的时候遇到非法字符结束,返回解析到的数值。也就是说只要字符串头部是合法数值,那么就能解析出数值,哪怕整体不是数值。比如123abc,会被解析程123。

因此,上面的判断方式还不够严谨,下面的终极方案是比较严谨的方式。

3. isNaN、isFinite

在介绍这两个方法之前,先讲下NaN,它表示Not-a-Number。两个NaN无法直接比较相等,因为我们只知道它不是数值,是啥不确定,也就无法比较相等。

1 2 3 NaN === NaN;         // false NaN == NaN;          // false Object.is(NaN, NaN); // false
  • isNaN(value),如果ToNumber(value)的结果为NaN返回true,否则返回false。
  • isFinite(value),如果ToNumber(value)的结果为数值,且不等于Infinity或-Infinity返回true,否则返回false。

isNaN和isFinite都会先将传入的值转成数值,再进行判断。ToNumber的规则跟直接使用Number函数一样。一些非数值在类型转换的时候都能转成数值,比如:

1 2 3 4 Number(true);         // 1 Number(false);        // 0 Number(null);         // 0 Number('');           // 0

对null、true、false、''使用isNaN结果都是false,但是它们本身不是数值,因此不能单独使用isNaN。

4. Number.isNaN、Number.isFinite

这两个方法跟对应的全局方法是不一样的。

  • Number.isNaN(value),如果value为NaN返回true,否则返回false。
  • Number.isFinite(value),如果value为数值,且不等于Infinity或-Infinity返回true,否则返回false。

区别是全局方法会有强制类型转换,而这两个方法没有强制类型转换:

1 2 3 4 Number.isNaN(null);      // true Number.isNaN(true);      // true Number.isNaN(false);     // true Number.isNaN('');        // true

可以看,由于没有类型转换,所以Number.isNaN判断null、true、false、''的结果都是true。

但是“副作用”是数字字符串也会得到true:

1 Number.isNaN('123');    // true

Number.isNaN等价与:

1 2 3 Number.isNaN = Number.isNaN || function(value) {     return typeof value === "number" && isNaN(value); }

而Number.isFinite等价于:

1 2 3 if (Number.isFinite === undefined) Number.isFinite = function(value) {     return typeof value === 'number' && isFinite(value); }

因此,这两个方法本质上也是基于类型的,没法判断一个字符串是否为数值。

5. 正则表达式

1 2 3 let exp = /^[+-]?\d*(\.\d*)?(e[+-]?\d+)?$/; exp.test('+1.9');   // true exp.test('-.1e11'); // true

这个正则可以判断整数、浮点数、正负数和科学计数法。

不过我觉得判断是否是数值用正则,有点小题大做了。

6. 终极方案(推荐)

我们先看方案:

1 !isNaN(parseFloat(value)) && isFinite(value);

这其实是jquery中$.isNumeric的源码,多么简洁且优雅。

接下来我们看看它的原理,我们以字符串123abc为例,我们应该得到false。

  1. parseFloat('123abc')得到123;
  2. !isNaN(123)得到true;
  3. isFinite('123abc')得到false;
  4. 最终结果为false。

单独使用!isNaN(parseFloat(value))会将123abc当成数值,所以用isFinite额外判断一次,isFinite的另一个作用是排除无穷数。

1 2 !isNaN(parseFloat(Infinity));  // true !isNaN(parseFloat(Infinity)) && isFinite(Infinity); // false

而且,因为parseFloat的解析是纯字符串解析,没有类型转换,所以不会将null、true、false、''当成数值。

1 2 3 4 !isNaN(parseFloat(null)) && isFinite(null);   // false !isNaN(parseFloat(true)) && isFinite(true);   // false !isNaN(parseFloat(false)) && isFinite(false); // false !isNaN(parseFloat('')) && isFinite('');       // false

妙,妙不可言。

7. 结语

对这几个方法的介绍并不全面,因为我们探讨的主题是“判断值是否为数值”。这几个方法任何一个单独拎出来,都能讲一篇,有时间再跟大家分享。

标签:isNaN,false,数字,JavaScript,Number,value,几种,true,isFinite
From: https://www.cnblogs.com/dirgo/p/17996575

相关文章

  • [转]JavaScript 的if()语句和==的判断
    原文地址:JavaScript的if语句和==的判断-系佛-博客园一.if(xx)的判断JavaScript遇到预期为布尔值的地方(比如if语句的条件部分),就会将非布尔值的参数自动转换为布尔值。系统内部会自动调用Boolean函数。1.当if括号里面的表达式为Boolean时,直接判断if(true){conso......
  • 华为云DTSE助力车卫士架构升级,探索智能出行行业数字化新路径
    本文分享自华为云社区《华为云DTSE助力车卫士技术架构升级,探索智能出行行业数字化新路径》,作者:HuaweiCloudDeveloper。毫无疑问,在双碳背景以及先进技术的加持下,智能网联汽车已成为汽车产业创新发展的重要方向。十年来,智能网联汽车在政策供给、标准赋能、产业示范和安全保障等方面......
  • [office] 满足常用财务工作需要的Excel表格数字格式设置
    在公司日常的财务管理中,主要处理的数据类型就应该是数字,通常包括产品数量和货币数量这两个大类。这些作为财务语言的数字通常需要某种特定的表示方法,或者说是格式化形式。Excel充分考虑到财务工作者在这方面的需要,提供了多种面向财务数字的格式化设置方案。现在,就将向用户介绍3种最......
  • 深入理解 C# 编程:枚举、文件处理、异常处理和数字相加
    C#枚举枚举是一个特殊的“类”,表示一组常量(不可更改/只读变量)。要创建枚举,请使用enum关键字(而不是class或interface),并用逗号分隔枚举项:enumLevel{Low,Medium,High}您可以使用点语法访问枚举项:LevelmyVar=Level.Medium;Console.WriteLine(myVar);Enu......
  • 【专题】保险行业数字化洞察白皮书报告PDF合集分享(附原数据表)
    报告链接:https://tecdat.cn/?p=33203原文出处:拓端数据部落公众号近年来,"养老"、"三胎政策"、"医疗成本"等一系列备受关注的民生话题,使得保险服务备受瞩目,并逐渐渗透到每个人的生活中。自2020年以来,由于多种因素的影响,人们对健康的意识不断提高,这正在重新塑造中国消费者对保险的......
  • 深入理解 C# 编程:枚举、文件处理、异常处理和数字相加
    C#枚举枚举是一个特殊的“类”,表示一组常量(不可更改/只读变量)。要创建枚举,请使用enum关键字(而不是class或interface),并用逗号分隔枚举项:enumLevel{Low,Medium,High}您可以使用点语法访问枚举项:LevelmyVar=Level.Medium;Console.WriteLine(myVar);En......
  • 财务数字化变革的路径与策略
    如何看待财务数字化与企业数字化?首先来看什么是企业数字化?企业数字化有三个核心、五个目的。三个核心:以数据驱动为核心,以数字化技术为核心,以算法模型为核心,数据、技术和算法是基础。五个目的:实现运营效率、资源配置、决策模型、商业模式和企业效益的变化。企业数字化......
  • MySQL金额数字转为大写中文
    MySQL版本:5.7.34-log*通过创建函数的方法,目前可以实现整数金额的转换,网上暂未找到MySQL版本的故自己参照其他数据库版本的改编了一下,*仅供参考!!!使用方法:selectrmb(10000)CREATEDEFINER=`root`@`%`FUNCTION`rmb_upper`(jeint)RETURNSvarchar(200)DETERMINISTICBE......
  • 隐写术-数字水印的原理、实现及应用
    导语前段时间有一则阿里员工外泄信息被捕获的报道。大致内容是阿里的某位员工,在内部办公软件截图,使用PS工具修掉截图上的可见水印,然后传播出去,但阿里通过图片携带的不可见水印,解读了截图员工的员工编码,从而找到了泄漏图片的员工。一时间,图片的盲水印技术受到了广泛关注。本文针对......
  • C#正则提取字符串中的数字
    首先需要引入命名空间System.Text.RegularExpressions,具体实现如下所示://提取纯数字,该方式会将所有数字提取出来并拼接在一起,如:"ABC#123@AS456测试"提取出来就是123456varresult1=Regex.Replace("ABC#123@AS测试",@"[^0-9]+","");//提取多个数字,该方式会分别提取字符串中......