前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库isFinite Number.isFinite 区别
JavaScript值与类型

全局 isFinite 和 Number.isFinite 有什么区别?

全局 isFinite 会先用 Number() 把参数转成数字再判断,所以 isFinite('42')、isFinite(null) 都是 true。Number.isFinite 不做任何转换,参数不是 number 类型就直接返回 false。

前端进阶之旅 · 一题精讲更新于 2026.09.29
JavaScript#值与类型
先看核心答案读代码示例
理解线索

转不转类型,是两者唯一的区别

  1. isFinite(v)等价于先 Number(v),再判断结果不是 NaN 和正负 Infinity
  2. Number.isFinite(v)先看 typeof v === 'number',不是就返回 false
  3. 转换规则Number(null)、Number('')、Number([]) 都是 0,这是误判的来源

对真正的 number 类型参数,两者结果完全一样,包括 -0、NaN、Infinity。差异只出现在非 number 参数上。

核心回答

先记住这个答案

区别只有一个:转不转类型。全局 isFinite(v) 会先执行 Number(v),再判断结果是不是有限数;Number.isFinite(v) 先检查 v 是不是 number 类型,不是就直接返回 false。所以 isFinite('42') 是 true,Number.isFinite('42') 是 false。实际项目里判断「这个值是不是一个有限的数字」,用 Number.isFinite。

  • isFinite 先转数字再判断,会误放行
  • Number.isFinite 只认 number 类型
  • 全局 isFinite 会先做类型转换
  • 显式转换后用 Number.isFinite 校验

同一组值,两种结果

最直观的办法是拿一堆不同类型的值分别喂给两个函数。

对照表JavaScript
const cases = [42, '42', '', '  ', null, undefined, true, [], [7], {}, NaN, Infinity]
for (const v of cases) {
  const label = typeof v === 'string' ? `'${v}'` : Array.isArray(v) ? `[${v}]` : String(v)
  console.log(label.padEnd(10), isFinite(v), Number.isFinite(v))
}
查看输出与解释
42         true true
'42'       true false
''         true false
'  '       true false
null       true false
undefined  false false
true       true false
[]         true false
[7]        true false
[object Object] false false
NaN        false false
Infinity   false false

只有第一行 42 两边都是 true。中间一大段全是 isFinite 放行、Number.isFinite 拒绝的情况,原因都能追到 Number() 的转换规则上:Number('') 和 Number(' ') 是 0,Number(null) 是 0,Number(true) 是 1,Number([]) 是 0,Number([7]) 是 7。undefined 和 {} 转出来是 NaN,所以两边都是 false。

表单校验里怎么用才对

最常见的场景是校验输入框里的金额、数量。输入框拿到的永远是字符串,这时两个函数都不能直接用。

用 isFinite 会放过空输入
isFinite(input) 看起来能用,因为 '12.5' 会返回 true。问题是用户什么都没填、或者只敲了空格,Number('') 是 0,也会返回 true,空表单就被当成了金额 0 提交上去。
用 Number.isFinite 要先转换
直接 Number.isFinite(input) 则永远是 false,因为 input 是字符串。正确的写法是分两步:先排除空输入,再显式转换后判断。写成 input.trim() !== '' && Number.isFinite(Number(input)),空串、纯空格、'abc'、'Infinity' 都会被拦下。 这样写的好处是每一步做什么都看得见:转换规则由 Number() 负责,有限性由 Number.isFinite 负责,不会有藏在函数内部的隐式转换。如果业务允许 '12px' 这种带单位的写法,就把 Number 换成 parseFloat,这是有意识的选择,而不是被 isFinite 悄悄放过。
回答前,多想一步

容易答错的地方

以为区别只在数字字符串上
很多人只记得 '42' 的例子。实际上 null、空字符串、布尔值、空数组、只有一个元素的数组,全都会被全局 isFinite 当成有限数。这些值出现在校验逻辑里,往往意味着数据本身就有问题,却被放行了。
以为 Number.isFinite 更「严格」,所以结果会更少 true
对 number 类型的参数,两者结果完全一致,Number.isFinite 并没有额外的规则。它只是跳过了类型转换,并不会对数字本身做更严格的检查,比如小数、负数、-0 都返回 true。
试着用自己的话回答

面试官还会怎么问?

isNaN 和 Number.isNaN 是不是同样的关系?

是的。全局 isNaN('abc') 返回 true,因为 Number('abc') 是 NaN;Number.isNaN('abc') 返回 false,因为 'abc' 不是 number 类型。ES2015 把这两个函数挂到 Number 上,就是为了提供不做隐式转换的版本。

传一个 BigInt 进去会怎样?

Number.isFinite(1n) 返回 false,因为 BigInt 不是 number 类型。全局 isFinite(1n) 会直接抛 TypeError,因为它内部做的数字转换不允许把 BigInt 隐式转成 Number。这个例子能看出全局版本的转换不只是「宽松」,还可能直接报错。

判断一个值是不是整数用什么?

用 Number.isInteger,它同样不做类型转换,Number.isInteger('5') 是 false。如果还要保证整数能被精确表示,比如 ID、计数,用 Number.isSafeInteger,它会把超过 2^53 - 1 的数排除掉。

从一道题,走向一组知识

把知识连起来

值与类型

为什么 NaN 不等于自身?怎么可靠地判断一个值是不是 NaN?

isNaN 和 Number.isNaN 的区别和这题一模一样,也是转不转类型的问题。

值与类型

typeof 和 instanceof 分别在什么场景下用?各有什么坑?

Number.isFinite 内部先做的就是一次 typeof 判断,可以对照着看类型检查的几种手段。

放回知识体系中复习JavaScript 进阶知识

参考资料

  • Number.isFinite()

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 同一组值,两种结果
  3. 表单校验里怎么用才对
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑