或許題主對isFinite的含義有所誤解吧。
這裡的有窮數,並非數學上的有窮數(或許翻譯做有限數更合理),僅僅是相對於正無窮(∞,Infinity)和負無窮(-∞,-Infinity)而言,所做的事情無非是檢查輸入是否為數值(isNaN),並且位於浮點數的表示範圍內,即以下區間:
[-Number.MAX_VALUE , Number.MAX_VALUE]
其中,Number.MAX_VALUE ≈ 1.79E+308。
大於Number.MAX_VALUE就認為是Infinity,小於-Number.MAX_VALUE就是–Infinity。
計算機儲存浮點數的方式,不能表達數學上的無窮數。
因此,JavaScript中isFinite的實現可以簡單表示為:
function isFinite(value) {
const numeric = Number(value);
return (!Number.isNaN(numeric)) && numeric >= -Number.MAX_VALUE && numeric <= Number.MAX_VALUE;
}
以上是全域性函式。Number.isFinite的實現也類似,省去了型別轉換,透過借用全域性isFinite甚至更簡單,如下:
Number.isFinite = (value) {
return typeof(value) === "number" && isFinite(value);
補充:以下是早期V8中的一個全域性isFinite的JS實現(最新的版本中已被替換為C++),原理相似,但更最佳化。
或許題主對isFinite的含義有所誤解吧。
這裡的有窮數,並非數學上的有窮數(或許翻譯做有限數更合理),僅僅是相對於正無窮(∞,Infinity)和負無窮(-∞,-Infinity)而言,所做的事情無非是檢查輸入是否為數值(isNaN),並且位於浮點數的表示範圍內,即以下區間:
[-Number.MAX_VALUE , Number.MAX_VALUE]
其中,Number.MAX_VALUE ≈ 1.79E+308。
大於Number.MAX_VALUE就認為是Infinity,小於-Number.MAX_VALUE就是–Infinity。
計算機儲存浮點數的方式,不能表達數學上的無窮數。
因此,JavaScript中isFinite的實現可以簡單表示為:
function isFinite(value) {
const numeric = Number(value);
return (!Number.isNaN(numeric)) && numeric >= -Number.MAX_VALUE && numeric <= Number.MAX_VALUE;
}
以上是全域性函式。Number.isFinite的實現也類似,省去了型別轉換,透過借用全域性isFinite甚至更簡單,如下:
Number.isFinite = (value) {
return typeof(value) === "number" && isFinite(value);
}
補充:以下是早期V8中的一個全域性isFinite的JS實現(最新的版本中已被替換為C++),原理相似,但更最佳化。