JavaScript 中的無窮數(Infinity)

做者: Dmitri Pavlutin
譯者:前端小智
來源:dmitripavlutin
點贊再看,養成習慣

本文 GitHub https://github.com/qq44924588... 上已經收錄,更多往期高贊文章的分類,也整理了不少個人文檔,和教程資料。歡迎Star和完善,你們面試能夠參照考點複習,但願咱們一塊兒有點東西。javascript


爲了保證的可讀性,本文采用意譯而非直譯。前端

Infinity(無窮大)在 JS 中是一個特殊的數字,它的特性是:它比任何有限的數字都大,若是不知道 Infinity, 咱們在一些運算操做遇到時,就會以爲頗有意思。java

如今咱們來看看 JS 中的Infinity 屬性,瞭解用例並解決一些常見的陷阱。git

1.Infinity(無窮)的定義

無窮能夠分爲兩種,正無窮和負無窮,JS 中對應的表示方式爲:+Infinity(或者Infinity) 和 -Infinitygithub

這意味着Infinity-Infinity(小於任何有限數的數字)都是number類型的特殊值:面試

typeof Infinity;  // => 'number'
typeof -Infinity; // => 'number'

Infinity 是全局對象的屬性:算法

window.Infinity; // => Infinity

另外,Number函數也有兩個屬性來表示正負無窮大:數組

Number.POSITIVE_INFINITY; // => Infinity
Number.NEGATIVE_INFINITY; // => -Infinity

2. Infinity 的特性

Infinity比任何有限數都大。 微信

舉幾個例子 Look Look:函數

Infinity > 100;                     // => true
Infinity > Number.MAX_SAFE_INTEGER; // => true
Infinity > Number.MAX_VALUE;        // => true

Infinity 在加法、乘法和除法等算術運算中用做操做數時會產生有趣的效果:

Infinity + 1;        // => Infinity
Infinity + Infinity; // => Infinity

Infinity * 2;        // => Infinity
Infinity * Infinity; // => Infinity

Infinity / 2;        // => Infinity

一些Infinity 的運算獲得有限的數:

10 / Infinity; // => 0

一個有限的數除以0獲得 Infinity 結果:

2 / 0; // => Infinity

對無窮數進行概念上不正確的運算會獲得NaN。 例如,不能除以無限數,也沒法肯定無限數是奇數仍是偶數:

Infinity / Infinity; // => NaN
Infinity % 2;        // => NaN

2.1 負無窮

負無窮小於任何有限數

-Infinity 與一些有限數字進行比較:

-Infinity < 100;                      // => true
-Infinity < -Number.MAX_SAFE_INTEGER; // => true
-Infinity < -Number.MAX_VALUE;        // => true

同時,負無窮小於正無窮:

-Infinity < Infinity; // => true

當使用不一樣操做符操做數時,也可能會獲得負無窮:

Infinity * -1; // => -Infinity
Infinity / -2; // => -Infinity
-2 / 0;        // => -Infinity

3.判斷無窮

幸運的是,Infinity等於相同符號的Infinity

Infinity === Infinity; // => true
-Infinity === -Infinity; // => true

但前面的符號不同就不相等,就也很好理解:

Infinity === -Infinity; // => false

JSt有一個特殊的函數Number.isFinite(value),用於檢查提供的值是否有限數:

Number.isFinite(Infinity);  // => false
Number.isFinite(-Infinity); // => false
Number.isFinite(999);       // => true

4. 無窮的的使用狀況

當咱們須要初始化涉及數字比較的計算時,無窮值就很是方便。例如,在數組中搜索最小值時:

function findMin(array) {
  let min = Infinity;
  for (const item of array) {
    min = Math.min(min, item);
  }
  return min;
}

findMin([5, 2, 1, 4]); // => 1

min變量使用Infinity初始化。 在第一次for()迭代中,最小值成爲第一項。

5. Infinity 的的一些坑

咱們極可能不會常常使用Infinity值。 可是,值得知道什麼時候會出現Infinity值。

5.1. 解析數據

假設 JS 使用一個輸入(POST請求、輸入字段的值等)來解析一個數字。在簡單的狀況下,它會工做得很好:

parseFloat('10.5'); // => 10.5

parseFloat('ZZZ'); // => NaN

這裏須要當心的,parseFloat()'Infinity'字符串解析爲實際的Infinity數:

parseFloat('Infinity'); // => Infinity

另外一個是使用parseInt()來解析整數,它沒法將'Infinity'識別爲整數:

parseInt('10', 10); // => 10

parseInt('Infinity', 10); // => NaN

5.2 JSON 序列化

JSON.stringify()Infinity數字序列化爲null

const worker = {
 salary: Infinity
};

JSON.stringify(worker); // => '{ "salary": null }'

salary 屬性值爲Infinity可是當字符串化爲JSON時,"salary"值將變爲null

5.3 最大數溢出

Number.MAX_VALUE是 JS 中最大的浮點數。

爲了使用甚至大於Number.MAX_VALUE的數字,JS 將該數字轉換爲Infinity

2 * Number.MAX_VALUE; // => Infinity
Math.pow(10, 1000);   // => Infinity

5.4 Math 函數

JS 中Math命名空間的某些函數能夠返回Infinity:

const numbers = [1, 2];
const empty = [];

Math.max(...numbers); // => 2
Math.max(...empty);   // => -Infinity

Math.min(...numbers); // => 1
Math.min(...empty);   // => Infinity

在不帶參數的狀況下調用Math.max()時,返回-Infinity,而Math.min()則相應地返回Infinity。 若是嘗試肯定一個空數組的最大值或最小值,那結果後面人感到意外。

總結

JS中的Infinity表示無窮數的概念。 任何有限數均小於Infinity,而任何有限數均大於-Infinity

比較 JS 中的無窮值很容易:Infinity === Infinitytrue。特殊的函數Number.isFinite()肯定提供的參數是不是一個有限的數字。

在涉及數字比較的算法時,可使用Infinite初始化變量,用例是尋找數組的最小值。

解析來自輸入的數字時,必須當心InfinityNumber('Infinity')parseFloat('Infinity')返回實際的Infinity。 當使用JSON.stringify()序列化時,Infinity變爲null


原文:https://dmitripavlutin.com/in...

代碼部署後可能存在的BUG無法實時知道,過後爲了解決這些BUG,花了大量的時間進行log 調試,這邊順便給你們推薦一個好用的BUG監控工具 Fundebug


交流

文章每週持續更新,能夠微信搜索「 大遷世界 」第一時間閱讀和催更(比博客早一到兩篇喲),本文 GitHub https://github.com/qq449245884/xiaozhi 已經收錄,整理了不少個人文檔,歡迎Star和完善,你們面試能夠參照考點複習,另外關注公衆號,後臺回覆福利,便可看到福利,你懂的。

相關文章
相關標籤/搜索