JavaScript判斷數字方法

在JavaScript中,判斷一個值是否為數字有多種場景,以下是常見方法及適用情況:


1.?嚴格判斷數字類型(排除NaN

使用?typeof?結合?!isNaN(),確保值是?number?類型且非?NaN

javascript

function isNumber(value) {return typeof value === 'number' && !isNaN(value);
}// 測試
isNumber(42);        // true
isNumber(3.14);      // true
isNumber(NaN);       // false(NaN 被排除)
isNumber('42');      // false(字符串類型)
isNumber(true);      // false(布爾類型)

2.?判斷可轉換為數字的值(包括字符串數字)

使用?!isNaN()?和顯式類型轉換(parseFloat?或?Number):

javascript

function isNumeric(value) {return !isNaN(parseFloat(value)) && isFinite(value);
}// 或更簡潔的版本(注意空字符串會返回 false)
function isNumeric(value) {return !isNaN(value) && value !== '' && value !== null;
}// 測試
isNumeric(42);         // true
isNumeric('42');       // true
isNumeric('-3.14');    // true
isNumeric('  42  ');   // true(空格會被忽略)
isNumeric('42abc');    // false(含非數字字符)
isNumeric('');         // false
isNumeric(true);       // false(布爾值需額外處理)

3.?使用正則表達式(精確控制格式)

匹配整數、小數、科學計數法:

javascript

function isNumeric(value) {return /^[-+]?(\d+\.?\d*|\.\d+)([eE][-+]?\d+)?$/.test(value);
}// 測試
isNumeric('42');       // true
isNumeric('3.14');     // true
isNumeric('.5');       // true(0.5 的簡寫)
isNumeric('1e5');      // true(科學計數法)
isNumeric('0xFF');     // false(不匹配十六進制)
isNumeric('12a');      // false

4.?特殊值處理

  • Infinity?/?-Infinity:
    使用?isFinite()?排除:

    javascript

    isFinite(42);       // true
    isFinite(Infinity);  // false
  • 空字符串或空白字符串:
    需額外檢查:

    javascript

    function isNumeric(value) {if (typeof value === 'string' && value.trim() === '') return false;return !isNaN(value);
    }

5.?其他方法對比

方法示例輸入結果說明
typeof x === 'number'42?僅限數字類型,包含?NaN
!isNaN(x)'42'?包含可轉換字符串
Number.isFinite(x)'42'?僅數字類型且非?Infinity
isNaN(x)'abc'?不可靠(isNaN('')?為 false)

總結建議

  • 純數字類型:

    javascript

    const isNumber = (value) => typeof value === 'number' && !isNaN(value);
  • 包含字符串數字:

    javascript

    const isNumeric = (value) => !isNaN(parseFloat(value)) && isFinite(value) && (typeof value !== 'string' || value.trim() !== '');

根據需求選擇合適方法,注意邊界值(如空字符串、InfinityNaN)。

以下是 JavaScript 函數轉換為 TypeScript 的完整實現,包括類型注解和優化處理:

typescript

/*** 檢查一個值是否可轉換為有效的數字* @param value - 要檢查的值(任意類型)* @returns 如果值可轉換為有效數字則返回 true,否則返回 false*/
const isNumeric = (value: unknown): boolean => {// 處理字符串:排除空字符串和純空白字符串if (typeof value === 'string') {return value.trim() !== '' && !isNaN(parseFloat(value)) && Number.isFinite(Number(value));}// 處理其他類型(數字、布爾值等)return typeof value === 'number' ? Number.isFinite(value) // 檢查有效數字(排除 NaN/Infinity): value !== null && value !== undefined && !isNaN(Number(value));
};

關鍵改進說明:

  1. 類型安全

    • 使用?unknown?作為輸入類型,確保類型安全

    • 明確的返回類型?boolean

  2. 邏輯優化

    • 單獨處理字符串類型,明確排除空/空白字符串

    • 使用?Number.isFinite?替代全局?isFinite?避免類型轉換問題

    • 對非字符串類型進行更安全的處理

  3. 測試用例覆蓋

    typescript

    // 有效數字
    console.log(isNumeric(42));           // true
    console.log(isNumeric('42'));         // true
    console.log(isNumeric(' 3.14 '));     // true
    console.log(isNumeric(-12.34));       // true
    console.log(isNumeric('1e3'));        // true
    console.log(isNumeric(true));         // false (布爾值)// 無效數字
    console.log(isNumeric(''));           // false (空字符串)
    console.log(isNumeric('   '));        // false (空白字符串)
    console.log(isNumeric('42abc'));      // false (含非數字字符)
    console.log(isNumeric(NaN));          // false
    console.log(isNumeric(Infinity));     // false
    console.log(isNumeric(null));         // false
    console.log(isNumeric(undefined));    // false
    console.log(isNumeric({}));           // false (對象)
    console.log(isNumeric([1, 2]));       // false (數組)
    console.log(isNumeric('123.45.67'));  // false (無效格式)

為什么這樣改寫?

  1. 避免全局?isFinite?的類型問題

    • TypeScript 中全局?isFinite?要求參數為?number?類型

    • 使用?Number.isFinite(Number(value))?確保安全類型轉換

  2. 精確處理字符串

    • 單獨處理字符串類型,避免?trim()?在非字符串上的調用錯誤

    • 顯式排除空/空白字符串情況

  3. 更好的類型推斷

    • 使用類型守衛 (typeof value === 'string') 確保類型安全

    • 對數字類型進行直接檢查,避免不必要的轉換

  4. 邊緣情況處理

    • 正確處理?null?和?undefined

    • 處理布爾值(true/false?不被視為數字)

    • 處理對象和數組等復雜類型

此實現保持了原 JavaScript 函數的行為,同時增加了 TypeScript 的類型安全性,并優化了邊緣情況的處理邏輯。

/*** 檢查一個值是否可轉換為有效的數字* @param value - 要檢查的值(任意類型)* @returns 如果值可轉換為有效數字則返回 true,否則返回 false*/
export function isNumeric(value: unknown) {// 處理字符串:排除空字符串和純空白字符串if (typeof value === "string") {return value.trim() !== "" && !isNaN(parseFloat(value)) && Number.isFinite(Number(value));}// 處理其他類型(數字、布爾值等)return typeof value === "number"? Number.isFinite(value) // 檢查有效數字(排除 NaN/Infinity): value !== null && value !== undefined && !isNaN(Number(value));
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92034.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92034.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92034.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++編程之旅-- -- --始探門庭的求知漫溯(二)

目錄引用內聯函數(C11)auto關鍵字基于范圍的for循環指針空值---nullptr引用 引用:指將變量以另一個名稱來展現的。它并非是一個新變量而是一個別名,它們同指一塊內存空間。就如古時那些有字的人,亦或者是周樹人,你說魯迅是不是周樹人呢&…

wordpress網站的“管理員郵箱地址”有什么用?

在WordPress網站的“設置”-“常規”中設置的“管理員郵箱地址”有多種用途,以下是詳細介紹: 一、用戶注冊相關 密碼找回功能 當網站用戶忘記密碼時,他們會通過點擊登錄頁面上的“忘記密碼”鏈接來重置密碼。WordPress系統會向管理員郵箱地…

202506 電子學會青少年等級考試機器人六級實際操作真題

更多內容和歷年真題請查看網站:【試卷中心 -----> 電子學會 ----> 機器人技術 ----> 六級】 網站鏈接 青少年軟件編程歷年真題模擬題實時更新 202506 青少年等級考試機器人實操真題六級 一、實際操作 1. 主題:姿態傳感器交互步進電機左右…

Centos 安裝 redis

1.下載redis,這個自己去網上找吧。2.上傳文件,redis-7.4.1.tar.gz3.解壓:執行 tar -xf redis-7.4.1.tar.gz在進行安裝之前,檢查一下有沒有make、gcc、python3、沒有的話全部 yum install。安裝完之后,如果報一下錯誤&a…

算法訓練營DAY55 第十一章:圖論part05

并查集理論基礎 背景 當我們需要判斷兩個元素是否在同一個集合里的時候,我們就要想到用并查集。 并查集主要有兩個功能: 將兩個元素添加到一個集合中。判斷兩個元素在不在同一個集合 原理講解 從代碼層面,我們如何將兩個元素添加到同一個…

docker相關操作記錄

1.docker清理服務器上面沒有用到的鏡像#刪除本地鏡像 docker rmi $(docker images -q) #強制刪除本地鏡像 docker rmi $(docker images -q) -f2.docker查看日志docker logs c36c56e4cfa3 (容器id)3.所有運行或沒有運行的鏡像 docker ps -a4、停止container,這樣才…

LInux基礎學習筆記七

/dev/zero和/dev/null 是什么/dev/zero:一個零設備文件,讀取時會不斷返回\0字節(零值字節),常用于創建空文件或格式化/dev/null:一個空設備文件,寫入它的內容會被丟棄,相當于“黑洞”…

軟件架構:系統結構的頂層設計與戰略約束

軟件架構:系統結構的頂層設計與戰略約束軟件架構是軟件系統的“骨架”與“憲法”,它定義了系統的根本性組織結構,包括構成系統的關鍵構件、它們之間的組織關系、交互機制、約束原則以及指導性決策。它決定了系統在性能、可擴展性、可靠性、可…

基于spring boot的個人博客系統

2 開發技術 3 2.1 VUE框架 3 2.2 Mysql數據庫 3 2.3 Spring Boot框架 3 2.4 layui介紹 4 本程序在設計結構選擇上首選B/S,也是為了滿足程序今后升級便利,以及程序低維護成本的要求。本程序的網絡拓撲設計也會在下圖展示,通過圖形的方式來描述…

Excel制作尖刀圖,直觀展示業績漲跌

Excel制作尖刀圖,直觀展示業績漲跌效果展示下圖是一個常見的兩年業績同比表,也是尖刀圖很常見的數據源類型,但是這個數據格式是無法直接制作的,需要對數據進行加工。1.對數據進行逆透視使用excel進行逆透視,最常見的方…

兩種路由模式(React-Router 8)

倆種路由模式 各個主流框架的路由常用的路由模式有倆種,history模式和hash模式,ReactRouter分別由createBrowerRouter和createHashRouter函數負責創建附帶代碼:import Login from "../page/Login"; import Article from "../page/Article"; imp…

【01】OpenCV C++實戰篇——基于多項式插值的亞像素邊緣定位算法

文章目錄一. 背景二. 你的經歷三. 代碼實現(龜速版——單線程)3.1 梯度幅值3.1.1 生成 8 個方向模板3.1.2 計算梯度3.1.3 顯示梯度圖像3.1.4 程序運行演示3.2 梯度方向 (梯度最大幅度值和方向)3.3 單像素邊緣3.4 梯度單像素邊緣提取 運行測試四 、亞像素…

400V降24V,200mA,應用領域:從生活到工業的 “全能電源管家”WD5208

WD5208 電源芯片:小身材蘊藏大能量的電源控制新星在電源芯片的技術星河中,WD5208 憑借獨特性能與廣泛適用性嶄露頭角,成為眾多電子設備電源方案的優選。本文將全面解析這款芯片的核心優勢、應用場景與技術細節,展現其 “小身材&am…

C++ 引用 和 指針 的區別

特性引用指針初始化不能為 null,必須綁定到有效的對象可以為 null,不指向任何對象重新綁定不能重新綁定,一旦初始化后始終引用同一個對象可以重新指向其他對象內存占用不占用額外內存,編譯器通常將其優化為所引用的對象占用額外內…

Claude Code實戰體驗:AI智能編程助手如何重塑開發工作流?

一、背景介紹 AI大模型的爆發,讓各種智能編碼工具如雨后春筍般涌現。Claude Code就是其中非常有代表性的一款——它不僅能補全代碼、查找Bug,還能理解復雜需求,甚至幫你寫文檔、生成測試用例。作為一名全棧開發者,我和團隊最近幾個…

centos7 個人網站搭建之gitlab私有化部署實現線上發布

文章目錄 效果展示架構設計申請免費阿里云服務器嘗試連接遠程服務 開放端口申請域名 綁定云服務器組網網關服務器配置轉發代理網關服務器配置ssl 證書問題排查證書申請時報錯:Set the \server_name\ directive ti use the Nginx installer. gitlab私有化部署搭建git…

小米4A千兆版路由器刷機,解決Telnet無法連接問題

刷機極容易變磚,建議完全理清步驟后再進行操作 工具準備 1、小米4A千兆版路由器(注意一定是千兆版,只是4A無千兆按下列步驟會變磚),適配電源線 2、網線一根 3、需保證刷機過程中網線接入是有網的,無需賬號認…

計算機網絡:如何將一個B類IP地址分為4個子網

要將一個B類IP地址劃分為4個子網,需通過子網掩碼擴展(即借位)來實現。以下是詳細步驟和原理: 一、B類IP地址的基礎特性 默認網絡位:B類地址前16位為網絡位(標識網絡),后16位為主機位…

K8S 性能瓶頸排查

K8S 性能瓶頸排查 隨著業務量增長,Kubernetes 集群經常出現: ? Pod 啟動慢? ? API 響應慢? ? 節點 CPU 飆高? ? 服務無故中斷? 這可能是性能瓶頸在悄悄作祟。 性能瓶頸全局視角 # K8S 性能瓶頸排查思維導圖- 集群層面- API Server 響應慢- Etcd 壓力大- 控制面組件…

實習005 (web后端springboot)

五種創建方式一、方法一(直接創建)二、方法二(阿里云)三、方法三(從官網)或者說四、方法四、(案例云官網)五、方法五、(自己寫)先構建javaweb項目刷新后還是出…