JavaScript中Infinity(無窮數(shù))的使用和注意事項
前言
JavaScript 中的 Infinity 是一個可以應用于任何變量的數(shù)值,表示無窮大。下面就來看看 Infinity 是如何工作的,以及使用時的注意事項。
1. Infinity 概念
Infinity 是全局對象的一個屬性,即它是一個全局變量:
console.log(window.Infinity); // Infinity console.log(window.Infinity > 100); // true console.log(window.Infinity < 100); // false
Infinity 的初始值是 Number.POSITIVE_INFINITY。Infinity(正無窮大)大于任何值。在數(shù)學上,這個值的行為與無窮大相同。例如,任何正數(shù)乘以Infinity等于Infinity,任何數(shù)字除以Infinity等于 0。在 ECMAScript 5 的規(guī)范中, Infinity 是只讀的,即不可寫、不可枚舉或不可配置。
數(shù)字 Infinity 是 JavaScript 中的一個特殊值,它的值約為 1.79e+308 或 2¹?²?——JavaScript 中可以存儲為數(shù)字類型的最大值。
let bigNumber = 1e308, ? ? biggerNumber = 1e309; console.log(bigNumber); // 1e+308 console.log(biggerNumber); // Infinity
根據(jù)規(guī)范,Infinity 表示所有大于 1.7976931348623157e+308 的值:
let largeNumber = 1.7976931348623157e+308, ? ? largerNumber = 1.7976931348623157e+309; console.log(largeNumber); // 1.7976931348623157e+308 console.log(largerNumber); // Infinity
我們可以在瀏覽器的控制臺輸入9,當輸入308位時,結果還是1e+308,當輸入309位時,就會打印出 Infinity:
所有瀏覽器都是支持 Infinity 的:
2. Infinity 正負
Infinity 是有正負之分的,Infinity表示無窮大,-Infinity表示無窮小。超出 1.797693134862315E+308 的數(shù)值即為 Infinity,小于 -1.797693134862316E+308 的數(shù)值為無窮小。
console.log(1.7976931348623157e+309); // Infinity console.log(-1.7976931348623157e+309); // -Infinity
可以通過以下方式來得到 Infinity:
console.log(Infinity) // Infinity console.log(Number.POSITIVE_INFINITY) // Infinity console.log(Math.pow(2,1024)) // Infinity console.log(1.8e+308) // Infinity console.log(1/0) // Infinity
可以通過以下方式來得到 -Infinity:
console.log(-Infinity) // -Infinity console.log(Number.NEGATIVE_INFINITY) // -Infinity console.log(-1*Math.pow(2,1024)) // -Infinity console.log(-1.8e+308) // -Infinity console.log(1/-0) // -Infinity
將正數(shù)除以 Infinity 會得到 0;Infinity 除以 Infinity 會得到 NaN;正數(shù)除以 -Infinity 或負數(shù)除以 Infinity 得到 -0:
console.log(1/Infinity) // 0 console.log(Infinity/Infinity) // NaN console.log(1/-Infinity) // -0
3. Infinity 計算
Infinity 的行為基本上類似于數(shù)學上的無窮大,加、減或乘以它仍然是 Infinity:
console.log(Infinity + 3) // Infinity console.log(Infinity - 3) // Infinity console.log(Infinity * 3) // Infinity console.log(Infinity / 3) // Infinity console.log(Math.pow(Infinity, 2)) // Infinity console.log(Infinity + Infinity) // Infinity console.log(Infinity - Infinity) // NaN console.log(Infinity * Infinity) // NaN console.log(Infinity / Infinity) // NaN
對于 JavaScript 中所有的數(shù)字,即使是強大的 Infinity,使用 NaN 執(zhí)行數(shù)學運算都得到 NaN:
console.log(Infinity + NaN) // NaN console.log(Infinity - NaN) // NaN console.log(Infinity * NaN) // NaN console.log(Infinity / NaN) // NaN console.log(Math.pow(Infinity, NaN)) // NaN
4. Infinity 和 BigInt
在 JavaScript 中,對于任意大的整數(shù)值,有 BigInt 原始類型。但是,BigInt 不能很好地與 Infinity 配合使用,因為 Infinity 是 JavaScript 原始類型 number,不能與 BigInt 混合使用。
try{console.log(37/0)} catch(e) {console.log(e)} // Infinity // BigInts 用數(shù)字后面的 n 表示: try{console.log(37n/0)} catch(e) {console.log(e)} // TypeError: "can't convert BigInt to number" try{console.log(37/0n)} catch(e) {console.log(e)} // TypeError: "can't convert BigInt to number" try{console.log(37n/0n)} catch(e) {console.log(e)} // RangeError: "BigInt division by zero" // 可以將 BigInts 轉換為 Numbers: try{console.log(Infinity+37n)} catch(e) {console.log(e)} // TypeError: "can't convert BigInt to number" try{console.log(Infinity+Number(37n))} catch(e) {console.log(e)} // Infinity // 可能不需要BigInts,因為它可以是任意大小,并且 JavaScript 中的最大安全整數(shù)只有 16 位長: console.log(Number.MAX_SAFE_INTEGER) // 9007199254740991
5. Infinity 檢查
可以通過使用 == 或 === 將值與 Infinity 進行比較來檢查 Infinity:
console.log(Infinity == 1/0) // true console.log(Infinity === 1/0) // true // ==將強制字符串轉換為數(shù)字,但===不會: console.log(Infinity == "Infinity") // true console.log(Infinity === "Infinity") // false // 使用除法運算符將在比較之前強制執(zhí)行強制轉換: console.log(Infinity == "1"/"0") // true console.log(Infinity === "1"/"0") // true // 當強制轉換后值為NaN時: console.log(Infinity == "1/0") // false console.log(Infinity === "1/0") // false
當然,在處理 Infinity 時,ES6 中的 Object.is() 與 === 運算符的工作方式相同:
console.log(Object.is(Infinity, 1/0)) // true console.log(Infinity === 1/0) // true console.log(Infinity == 1/0) // true console.log(Object.is(Infinity, "Infinity")) // false console.log(Infinity === "Infinity") // false console.log(Infinity == "Infinity") // true
可以使用輔助函數(shù) Number.isFinite() 檢查值是否為有限數(shù)(不是 Infinity、-Infinity 或 NaN)。還有一個全局 isFinite() 函數(shù),它會執(zhí)行強制類型轉化,也就是它會先嘗試將值轉換為數(shù)字類型,然后再檢查它是否為有限數(shù)。
console.log(isFinite(45)); // true console.log(isFinite(-45)); // true console.log(isFinite('45')); // true console.log(isFinite('-75')); // true console.log(isFinite(Infinity)); // false console.log(isFinite(1.7976931348623157e+308)); // true console.log(isFinite(1.7976931348623157e+309)); // false
6. 注意事項
(1)max() 和 min()
如果沒有傳入值,Math.max()(返回傳入值中的最大值)將返回 -Infinity,Math.min()(返回傳入值中的最小值)將返回Infinity。
console.log(Math.max()); // -Infinity console.log(Math.min()); // Infinity
(2)Infinity 作為默認值
由于 Infinity 大于所有數(shù)字,因此它在檢查數(shù)組中的最小數(shù)字的函數(shù)中可能很有用:
function findMinimum(numbers) { ? let min = Infinity; ? for (const n of numbers) { ? ? if (n < min) { ? ? ? min = n ? ? }; ? } ? return min; } console.log(findMinimum([20, 6, 90])); // 6
因為 Infinity 大于所有數(shù)字,所以除非數(shù)組中的所有數(shù)字都超過 Infinity 閾值,否則結果不會有任何問題。
(3)轉換為 JSON 時
在處理 JSON 數(shù)據(jù)時,如果使用 JSON.stringify() 將 JavaScript 對象轉換為有效的 JSON 字符串,Infinity將會被轉化為null:
let myJSON = { ? value1: 6, ? value2: 'Example', ? value3: Infinity, ? value4: -Infinity, ? value5: 1.7976931348623157e+309 }; console.log(JSON.stringify(myJSON, null, 2));
打印結果如下:
{
"value1": 6,
"value2": "Example",
"value3": null,
"value4": null,
"value5": null
}
(4)parseFloat() 和 parseInt()
parseFloat() 用來解析一個字符串,并返回一個浮點數(shù)。parseInt() 用來解析一個字符串,并返回一個整數(shù)。parseFloat() 可以正確解析Infinity, 而 parseInt() 無法識別 Infinity :
總結
到此這篇關于JavaScript中Infinity(無窮數(shù))的文章就介紹到這了,更多相關js的無窮數(shù)Infinity內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
js獲取當前年月日-YYYYmmDD格式的實現(xiàn)代碼
下面小編就為大家?guī)硪黄猨s獲取當前年月日-YYYYmmDD格式的實現(xiàn)代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06使用JavaScript實現(xiàn)Java的List功能(實例講解)
使用JavaScript實現(xiàn)Java的List功能(實例講解)。需要的朋友可以過來參考下,希望對大家有所幫助2013-11-11JavaScript手寫源碼之omit函數(shù)的實現(xiàn)
最近突然有個新的想法,想去看看前端的小庫來提升自己的編碼能力。但是又不知道怎么去證明自己是否真的看懂了,那就實現(xiàn)一個omit函數(shù)吧2023-02-02詳解使用fetch發(fā)送post請求時的參數(shù)處理
這篇文章主要介紹了詳解使用fetch發(fā)送post請求時的參數(shù)處理的相關資料,需要的朋友可以參考下2017-04-04