溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ECMAScript數(shù)據(jù)類型之Number類型實例分析

發(fā)布時間:2022-06-06 09:41:03 來源:億速云 閱讀:124 作者:zzz 欄目:開發(fā)技術(shù)

這篇文章主要介紹“ECMAScript數(shù)據(jù)類型之Number類型實例分析”,在日常操作中,相信很多人在ECMAScript數(shù)據(jù)類型之Number類型實例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”ECMAScript數(shù)據(jù)類型之Number類型實例分析”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

Number 類型:

Number 類型使用 IEEE 754 格式表示整數(shù)和浮點值(在某些語言中也叫雙精度值),不同的數(shù)值類型相應(yīng)地也有不同的數(shù)值字面量格式。

練習(xí)場景

最基本的數(shù)值字面量格式是十進(jìn)制整數(shù),如下:

 const intNum = 42;

其他進(jìn)制

整數(shù)也可以用八進(jìn)制(以 8 為基數(shù))或十六進(jìn)制(以 16 為基數(shù))字面量表示

八進(jìn)制

對于八進(jìn)制字面量,第一個數(shù)字必須是零(0),然后是相應(yīng)的八進(jìn)制數(shù)字(數(shù)值 0~7),如果字面量中包含的數(shù)字超出了應(yīng)有的范圍,就會忽略前綴的零,后面的數(shù)字序列會被當(dāng)成十進(jìn)制數(shù)。

下面是幾個例子:

 let octalNum1 = 070; // 八進(jìn)制的 56 
 let octalNum2 = 079; // 無效的八進(jìn)制值,當(dāng)成 79 處理
 let octalNum3 = 08; // 無效的八進(jìn)制值,當(dāng)成 8 處理

注意: 八進(jìn)制字面量在嚴(yán)格模式下是無效的,會導(dǎo)致 JavaScript 引擎拋出語法錯誤

原因是ECMAScript 2015 或 ES6 中的八進(jìn)制值通過前綴 0o 來表示;嚴(yán)格模式下,前綴 0 會被視為語法錯誤,如果要表示八進(jìn)制值,應(yīng)該使用前綴 0o

十六進(jìn)制

要創(chuàng)建十六進(jìn)制字面量,必須讓真正的數(shù)值前綴 0x(區(qū)分大小寫),然后是十六進(jìn)制數(shù)字(09 以 及 AF),十六進(jìn)制數(shù)字中的字母大小寫均可

下面是幾個例子:

 let hexNum1 = 0xA; // 十六進(jìn)制 10 
 let hexNum2 = 0x1f; // 十六進(jìn)制 31

使用八進(jìn)制和十六進(jìn)制格式創(chuàng)建的數(shù)值在所有數(shù)學(xué)操作中都被視為十進(jìn)制數(shù)值。

注意: 由于 JavaScript 保存數(shù)值的方式,實際中可能存在正零(+0)和負(fù)零(-0);其中正零和負(fù)零在所有情況下都被認(rèn)為是等同的

浮點值

要定義浮點值,數(shù)值中必須包含小數(shù)點,而且小數(shù)點后面必須至少有一個數(shù)字,雖然小數(shù)點前面不是必須有整數(shù),但推薦加上

下面是幾個例子:

 const floatNum1 = 1.1;
 const floatNum2 = 0.1;
 const floatNum3 = .1; // 有效 但不推薦

因為存儲浮點值使用的內(nèi)存空間是存儲整數(shù)值的兩倍,所以 ECMAScript 總是想方設(shè)法把值轉(zhuǎn)換為整數(shù)。在小數(shù)點后面沒有數(shù)字的情況下,數(shù)值就會變成整數(shù)。類似地,如果數(shù)值本身就是整數(shù),只是小數(shù)點后面跟著 0(如 1.0),那它也會被轉(zhuǎn)換為整數(shù).

下面是幾個例子:

 let floatNum1 = 1.; // 小數(shù)點后面沒有數(shù)字,當(dāng)成整數(shù) 1 處理
 let floatNum2 = 10.0; // 小數(shù)點后面是零,當(dāng)成整數(shù) 10 處理

科學(xué)計數(shù)法

科學(xué)記數(shù)法用于表示一個應(yīng)該乘以10 的給定次冪的數(shù)值,對于非常大或非常小的數(shù)值浮點值可以用科學(xué)記數(shù)法來表示。

ECMAScript 中科學(xué)記數(shù)法的格式要求是一個數(shù)值(整數(shù)或浮點數(shù))后跟一個大寫或小寫的字母 e,再加上一個要乘的 10 的多少次冪。如下:

 let floatNum = 3.125e7; // 等于 31250000

解法:3.125 作為系數(shù),乘以 10 的 7 次冪,正常也直接書寫出來,只是用科學(xué)計數(shù)法會更加簡潔。

小數(shù)值

科學(xué)記數(shù)法也可以用于表示非常小的數(shù)值

默認(rèn)情況下,ECMAScript 會將小數(shù)點后至少包含 6 個零的浮點值轉(zhuǎn)換為科學(xué)記數(shù)法

例如,0.0000003 用科學(xué)記數(shù)法可以表示為 3e-7 ,又例如 0.000000000000000 03 會被轉(zhuǎn)換為 3e-17;

不清晰的話請看下圖:

ECMAScript數(shù)據(jù)類型之Number類型實例分析

浮點值精確度

浮點值的精確度最高可達(dá) 17 位小數(shù),但在算術(shù)計算中遠(yuǎn)不如整數(shù)精確。

舉例一個坑, 0.1 加 0.2 得到的不是 0.3,而是 0.30000000000000004,如下:

 /* 這里檢測兩個數(shù)值之和是否等于 0.3 */
 
 if (a + b == 0.3) { // 別這么干! 
  console.log("You got 0.3."); 
 } // 并不等于 0.3 因此if中的語句不會執(zhí)行

如果兩個數(shù)值分別是 0.05 和 0.25,或者 0.15 和 0.15,那沒問題;但如果是 0.1 和 0.2,如前所述,測試將失敗。由于這種微小的舍入錯誤,導(dǎo)致很難測試,因此永遠(yuǎn)不要測試某個特定的浮點值。

注意: 之所以存在這種舍入錯誤,是因為使用了 IEEE 754 數(shù)值,這種錯誤并非 ECMAScript 所獨有,其他使用相同格式的語言也有這個問題。

值的范圍

由于內(nèi)存的限制,ECMAScript 并不支持表示這個世界上的所有數(shù)值

最大值與最小值

ECMAScript 可以表示的最小數(shù)值保存在 Number.MIN_VALUE 中,這個值在多數(shù)瀏覽器中是 5e-324;可以表示的最大數(shù)值保存在 Number.MAX_VALUE 中,這個值在多數(shù)瀏覽器中是1.7976931348623157e+308。

小知識: 使用 Number.NEGATIVE_INFINITY(負(fù)無窮大) 和 Number.POSITIVE_INFINITY(正無窮大) 也可以獲取正負(fù) Infinity。

Infinity

如果某個計算得到的數(shù)值結(jié)果超出了 JavaScript 可以表示的范圍,那么這個數(shù)值會被自動轉(zhuǎn)換為一個特殊的 Infinity(無窮)值;任何無法表示的負(fù)數(shù)以 -Infinity(負(fù)無窮大)表示,任何無法表示的正數(shù)以 Infinity(正無窮大)表示。

isFinite() 函數(shù)

如果計算返回正 Infinity 或負(fù) Infinity,則該值將不能再進(jìn)一步用于任何計算

這是因為 Infinity 沒有可用于計算的數(shù)值表示形式,如果要確定一個值是不是有限大(即介于 JavaScript 能表示的最小值和最大值之間),可以使用 isFinite()函數(shù),如下所示:

 let result = Number.MAX_VALUE + Number.MAX_VALUE; 
 console.log(isFinite(result)); // false

注意: 雖然超出有限數(shù)值范圍的計算并不多見,但總歸還是有可能的;因此在計算非常大或非常小的數(shù)值時,有必要檢測一下計算結(jié)果是否超出范圍。

NaN

有一個特殊的數(shù)值叫 NaN,意思是 Not a Number(不是數(shù)值),用于表示本來要返回數(shù)值的操作失敗了(而不是拋出錯誤)。

練習(xí)場景

比如,用 0 除任意數(shù)值在其他語言中通常都會導(dǎo)致錯誤,從而中止代碼執(zhí)行。

但在 ECMAScript 中,0、 +0 或 -0 相除都會返回 NaN

 console.log( 0/0 ); // NaN 
 console.log( -0/+0 ); // NaN

如果分子是非 0 值,分母是有符號 0 或無符號 0,則會返回 Infinity 或 -Infinity

 console.log( 5/0 );  // Infinity 
 console.log( 5/-0 );  // -Infinity

NaN特性

任何涉及 NaN 的操作始終返回 NaN(如 NaN/10),并且 NaN 不等于包括 NaN 在內(nèi)的任何值。

例如,下面的比較操作會返回 false:

 console.log(NaN == NaN); // false

isNaN()函數(shù)

ECMAScript 提供了 isNaN()函數(shù)用于判斷檢測數(shù)值。

用法: 該函數(shù)接收一個參數(shù),可以是任意數(shù)據(jù)類型,然后判斷這個參數(shù)是否 “不是數(shù)值”。

性質(zhì): 把一個值傳給 isNaN() 后,該函數(shù)會嘗試把它轉(zhuǎn)換為數(shù)值;某些非數(shù)值的值可以直接轉(zhuǎn)換成數(shù)值,如字符串"10"或布爾值;任何不能轉(zhuǎn)換為數(shù)值的值都會導(dǎo)致這個函數(shù)返回true。

語法: isNaN(vallue) 必傳,參數(shù)為要檢測的值

列舉了5種常見場景,如下:

 /* isNaN:[潛意思]你是不是非數(shù)值或者不能轉(zhuǎn)數(shù)值呀 */
 
 console.log(isNaN(NaN)); // true 
 console.log(isNaN(10)); // false,10 是數(shù)值
 console.log(isNaN("10")); // false,可以轉(zhuǎn)換為數(shù)值 10 
 console.log(isNaN("blue")); // true,不可以轉(zhuǎn)換為數(shù)值
 console.log(isNaN(true)); // false,可以轉(zhuǎn)換為數(shù)值 1

解釋: 首先測試的是 NaN 本身,因為 Not a Number ,顯然會返回 true;接著測試了數(shù)值 10

和字符串"10",都返回 false,因為它們的數(shù)值都是 10;字符串"blue"不能轉(zhuǎn)換為數(shù)值,因此函數(shù)返

回 true;布爾值 true 可以轉(zhuǎn)換為數(shù)值 1,因此返回 false;

小知識: 雖然不常見,但 isNaN()可以用于測試對象。

機制: 首先會調(diào)用對象的 valueOf()方法,然后再確定返回的值是否可以轉(zhuǎn)換為數(shù)值;如果不能,再調(diào)用 toString() 方法,并測試其返回值。

數(shù)值轉(zhuǎn)換

有 3 個函數(shù)可以將非數(shù)值轉(zhuǎn)換為數(shù)值:Number()parseInt()和 parseFloat()。

Number()

Number()是轉(zhuǎn)型函數(shù),可用于任何數(shù)據(jù)類型。

語法

Number(object) 參數(shù)可選,為一個 JavaScript 對象;如果沒有提供參數(shù),則返回0。

Number()函數(shù)轉(zhuǎn)換規(guī)則:

  • 布爾值,true 轉(zhuǎn)換為 1,false 轉(zhuǎn)換為 0

  • 數(shù)值,直接返回

  • null,返回 0

  • undefined,返回 NaN

字符串,應(yīng)用以下規(guī)則:

  • 如果字符串包含數(shù)值字符,包括數(shù)值字符前面帶加、減號的情況,則轉(zhuǎn)換為一個十進(jìn)制數(shù)值。

  • 因此,Number("123")返回 123,Number("011") 返回 11(忽略前面的零

  • 如果字符串包含有效的浮點值格式如"1.1",則會轉(zhuǎn)換為相應(yīng)的浮點值(忽略前面的零)。

  • 如果字符串包含有效的十六進(jìn)制格式如"0xf",則會轉(zhuǎn)換為與該十六進(jìn)制值對應(yīng)的十進(jìn)制整

數(shù)值:

如果是空字符串(不包含字符),則返回 0

如果字符串包含除上述情況之外的其他字符,則返回 NaN

對象,調(diào)用 valueOf()方法,并按照上述規(guī)則轉(zhuǎn)換返回的值。如果轉(zhuǎn)換結(jié)果是 NaN,則調(diào)用toString()方法,再按照轉(zhuǎn)換字符串的規(guī)則轉(zhuǎn)換

Number()函數(shù)場景練習(xí)

從不同數(shù)據(jù)類型到數(shù)值的轉(zhuǎn)換有時候會比較復(fù)雜,看一看 Number() 的轉(zhuǎn)換規(guī)則就知道了

下面是幾個具體的例子:

 Number("一二三") // NaN
 Number(undefined) //NaN
 Number("001.01") // 1.01
 Number("") // 0
 Number(null) // 0

可以看到,字符串 "一二三" 轉(zhuǎn)換之后是 NaN,因為它找不到對應(yīng)的數(shù)值;undefined轉(zhuǎn)換后為NaN;字符串 001.101 轉(zhuǎn)換后是 1.01,因為前面的零被忽略了;最后空字符串null轉(zhuǎn)換后都是 0;

parseInt()

parseInt() 函數(shù)會解析一個字符串,并返回一個整數(shù),并且更專注于字符串是否包含數(shù)值模式。

語法

parseInt(string, radix)

參數(shù)1必選,為要被解析的字符串。

參數(shù)2可選,表示要解析的數(shù)字的基數(shù);該值介于 2 ~ 36 之間。

parseInt()函數(shù)轉(zhuǎn)換規(guī)則

  • 字符串最前面的空格會被忽略,從第一個非空格字符開始轉(zhuǎn)換

  • 如果第一個字符不是數(shù)值字符、加號或減號,parseInt()立即返回 NaN 這意味著空字符串也會返回 NaN(這一點跟 Number()不一樣,它返回 0)。

  • 如果第一個字符是數(shù)值字符、加號或減號,則繼續(xù)依次檢測每個字符,直到字符串末尾,或碰到非數(shù)值字符;如, "1234blue" 會被轉(zhuǎn)換為 1234,因為 "blue" 會被完全忽略;類似地,"22.5"會被轉(zhuǎn)換為 22,因為小數(shù)點不是有效的整數(shù)字符。

進(jìn)制轉(zhuǎn)換

假設(shè)字符串中的第一個字符是數(shù)值字符,parseInt() 函數(shù)也能識別不同的整數(shù)格式(十進(jìn)制、八進(jìn)制、十六進(jìn)制);換句話說,如果字符串以"0x"開頭,就會被解釋為十六進(jìn)制整數(shù);如果字符串以"0"開頭,且緊跟著數(shù)值字符,在非嚴(yán)格模式下會被某些實現(xiàn)解釋為八進(jìn)制整數(shù)

parseInt()函數(shù)練習(xí)場景

只有一個參數(shù)的場景

請看下面幾個例子:

 parseInt("22")  // 22
 parseInt("21.33") // 21
 parseInt(" 34 age 43 ")  // 34
 parseInt("Are you 99 ?")  // NaN
 parseInt("0010") // 10

兩個參數(shù)的場景

不同的數(shù)值格式很容易混淆,因此 parseInt() 也接收第二個參數(shù),用于指定底數(shù)(進(jìn)制數(shù))。如果知道要解析的值是十六進(jìn)制,那么可以傳入 16 作為第二個參數(shù),以便正確解析:

 parseInt("0xAF", 16); // 175 
 parseInt("33",8) // 102

事實上,如果提供了十六進(jìn)制參數(shù),那么字符串前面的"0x"可以省掉:

 let num1 = parseInt("AF", 16); // 175 
 let num2 = parseInt("AF"); // NaN

在這個例子中,第一個轉(zhuǎn)換是正確的,而第二個轉(zhuǎn)換失敗了。區(qū)別在于第一次傳入了進(jìn)制數(shù)作為參數(shù),告訴 parseInt() 要解析的是一個十六進(jìn)制字符串。而第二個轉(zhuǎn)換檢測到第一個字符就是非數(shù)值字符,隨即自動停止并返回 NaN。

通過第二個參數(shù),可以極大擴(kuò)展轉(zhuǎn)換后獲得的結(jié)果類型。比如:

 let num1 = parseInt("10", 2); // 2 按二進(jìn)制解析
 let num2 = parseInt("10", 8); // 8 按八進(jìn)制解析
 let num3 = parseInt("10", 10); // 10,按十進(jìn)制解析
 let num4 = parseInt("10", 16); // 16,按十六進(jìn)制解析

因為不傳底數(shù)參數(shù)相當(dāng)于讓 parseInt() 自己決定如何解析,所以為避免解析出錯,建議始終傳給它第二個參數(shù)。

注意: 大多數(shù)情況下解析的應(yīng)該都是十進(jìn)制數(shù),此時第二個參數(shù)就要傳入10.

parseFloat()

parseFloat() 函數(shù)可解析一個字符串,并返回一個浮點數(shù)

從下標(biāo) 0 開始檢測每個字符,解析到字符串末尾或者解析到一個無效的浮點數(shù)值字符為止;與parseInt()不同的是它第一次出現(xiàn)的小數(shù)點是有效的,但第二次出現(xiàn)的小數(shù)點就無效了,此時字符串的剩余字符都會被忽略

語法

parseFloat(string) 參數(shù)必選,為要被解析的字符串。

parseFloat()函數(shù)轉(zhuǎn)換規(guī)則

parseFloat()函數(shù)的另一個不同之處在于,它始終忽略字符串開頭的零。

這個函數(shù)能識別前面討論的所有浮點格式,以及十進(jìn)制格式(開頭的零始終被忽略),十六進(jìn)制數(shù)值始終會返回 ;因為 parseFloat() 只解析十進(jìn)制值,因此不能指定底數(shù)。

parseInt()函數(shù)練習(xí)場景

下面是幾個示例:

 parseFloat("1234blue"); // 1234,按整數(shù)解析
 parseFloat("0xA"); // 0 
 parseFloat("22.5"); // 22.5 
 parseFloat("0022.34.5"); // 22.34 
 parseFloat("3.125e7"); // 31250000

注意: 如果字符串表示整數(shù)(沒有小數(shù)點或者小數(shù)點后面只有一個零),則 parseFloat() 返回整數(shù)

到此,關(guān)于“ECMAScript數(shù)據(jù)類型之Number類型實例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI