惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
S
SegmentFault 最新的问题
D
DataBreaches.Net
H
Help Net Security
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
Martin Fowler
Martin Fowler
IT之家
IT之家
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
腾讯CDC
罗磊的独立博客
Y
Y Combinator Blog
阮一峰的网络日志
阮一峰的网络日志
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
Microsoft Security Blog
Microsoft Security Blog
J
Java Code Geeks
Vercel News
Vercel News
Hugging Face - Blog
Hugging Face - Blog
aimingoo的专栏
aimingoo的专栏
Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
博客园 - 三生石上(FineUI控件)

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 分享一下笔者的 Mac 装机必备软件 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流)
Number.isFinite和isFinite与isNaN()和Number.isNaN的区别
南风晚来晚相识 · 2026-04-16 · via 博客园_首页

判断是否为数字(不够完美)

function isNumber(value) {
    return typeof value === 'number' && !isNaN(value);
}
// 测试
isNumber(123);       // true
isNumber(0);         // true
isNumber(NaN);       // false (NaN 被排除)
isNumber(Infinity);  // true  (无穷大算数字)这里判断出错了
isNumber("123");     // false

判断是否为数字

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

这个办法虽然好,但有点累赘了。
因为你不清楚Number.isFinite的含义。

Number.isFinite

Number.isFinite(value) 是 ES6 引入的静态方法,
只有当 value 的类型为 "number",且该数字不是 NaN,也不是 Infinity 或 -Infinity 时,才返回 true。
Number.isFinite(): 不会类型强制转换
isFinite()会类型强制转换。

isFinite

先将value强制转换为数字"number",且该数字不是 NaN,也不是 Infinity 或 -Infinity 时,才返回 true。

isFinite()和Number.isFinite()的区别

isFinite()会进行强制类型转换,而Number.isFinite()不会进行类型转换。

Number.isFinite()和isFinite()的详细示例对比

// ✅ 对于真正的有限数字,两者返回一致
Number.isFinite(123);        // true
isFinite(123);               // true

// 对于非有限数字(NaN / Infinity)
Number.isFinite(NaN);        // false
isFinite(NaN);               // false

Number.isFinite(Infinity);   // false
isFinite(Infinity);          // false

Number.isFinite(undefined);  // false
isFinite(undefined);         // false (强制转化为数字,undefined -> NaN)

Number.isFinite("abc");      // false
isFinite("abc");             // false (强制转化为数字,"abc" -> NaN)

// ⚠️ 对于非数字类型,开始出现巨大分歧
Number.isFinite("123");      // false (因为类型是 string)
isFinite("123");             // true  (会进行强制转换,"123" --> 123)

// ⚠️ 对于"",开始出现巨大分歧
Number.isFinite("");         // false
isFinite("");                // true  (会进行强制转换,"" --> 0)

// ⚠️ 对于true,开始出现巨大分歧
Number.isFinite(true);       // false
isFinite(true);              // true  (会进行强制转换,true -> 1)

// ⚠️ 对于null,开始出现巨大分歧
Number.isFinite(null);       // false
isFinite(null);              // true  (会进行强制转换,null -> 0)

// ⚠️ 对于[],开始出现巨大分歧
Number.isFinite([]);         // false
isFinite([]);                // true  (强制转化为数字,[] -> "" -> 0)

// ⚠️ 对于数字类型的数组,开始出现巨大分歧
Number.isFinite([5]);        // false
isFinite([5]);               // true  ([5] -> "5" -> 5,有限)

什么推荐使用 Number.isFinite?

更安全:避免因隐式转换导致的逻辑漏洞。
兼容性:ES6出来的,主流浏览器支持,但是IE不支持

更加简洁判断是否是数字的办法(不支持IE)

看了上面的讲解,判断数字的最佳办法是这个;

const isNumber = Number.isFinite(value)

兼容IE判断数字的方法

function isNumber(value) {
  return typeof value === 'number' && isFinite(value);
}
console.log(isNumber(Infinity)); // false
console.log(isNumber(NaN)); // false
console.log(isNumber('1234')); // false

isFinite() IE 兼容性

isNaN(value)

先将参数 value 强制转换为数字(调用的是ToNumber),再判断转换后的结果是否为 NaN。

isNaN("hello")    → true   (hello强制转化为数字NaN,返回true)。
isNaN("123abc");  → true  (Number("123abc") => NaN)
isNaN(undefined)  → true‌‌   (强制转化为数字NaN,因为Number(undefined)是NaN。所以返回true)
isNaN({});        → true  (Number({}) => NaN)

isNaN(123)        → false  (123 不是NaN,返回false)
isNaN("123")      → false (强制转化为数字123,123不是NaN,返回false)。
isNaN(null)       → false (强制转化为数字0,因为Number(null)是0。返回false)。‌‌
isNaN("");        → false (强制转化为数字0,因为Number("")是0,返回false)
isNaN("   ");     → false (强制转化为数字0,因为Number("   ")是0,返回false)
isNaN(false);     → false (Number(false),强制转化为数字0)
isNaN([]);        → false (Number([]),强制转化为数字0)

Number.isNaN(value)

不会对传入的参数value做类型转换。它只在 value 严格等于 NaN 时返回 true,其他所有情况都返回 false。

Number.isNaN() 和 isNaN()的区别

Number.isNaN()不会对传入的参数做类型转换。
isNaN()会对传入的参数做类型转换(强制转换为数字)。

// 典型的陷阱对比
Number.isNaN("abc");   // false (不会转换,直接判定不是 NaN,返回false)
isNaN("abc");          // true  (强制转化为数字类型NaN,Number("abc") => NaN, 返回true)

Number.isNaN(undefined); // false (不会转换,直接判定不是 NaN,返回false)
isNaN(undefined);        // true(强制转化为数字类型NaN,Number(undefined) => NaN, 返回true)

number()几个常见的值转化

Number("hello")    → NaN  
Number("123abc")   → NaN  
Number(undefined)  → NaN
Number({})         → NaN)
Number(null);      → 0
Number("");        → 0
Number("   ")      → 0
Number(false);     → 0
Number(true);      → 1
Number([]);        → 0
Number([5]);        → 5
Number([5, 6]);     → NaN