Numbers

數字值是由一連串數字字元組成,例如:

5

數字資料類型也包含一些代表數字概念的特殊全域屬性,例如 InfinityNaN (一個值代表「不是數字」),這可能是嘗試對非數值值進行數學計算的結果。

數字物件

將值傳遞至 Number() 函式時,該值會轉換為相等的數字。例如,數字字串會產生相等的數字基元:

Number( "10" );
> 10

falsenull 值傳遞至 Number() 會傳回 0true 會傳回 1

Number( null );
> 0

Number( false );
> 0

Number( true );
> 1`

如果無法轉換值 (例如 undefined 或包含非數字字元的字串),Number 函式會傳回 NaN

Number( undefined );
> NaN

Number( "The number 3." );
> NaN

原型繼承所述,您幾乎沒有理由使用 Number 物件做為建構函式,因為此物件會建立 Number 物件,而非數字常值。

let numObject = new Number( 15 );

numObject;
> Number { 15 }

這個物件的行為就像為數學運算的指派值,但會無法與數字常值進行嚴格的等式比較,因為資料類型兩者並不相符,而且並未針對常值提供任何實際好處。

let tenObject = new Number( 10 );

tenObject + 5;
> 15

tenObject === 10;
> false

浮點數和整數

JavaScript 只有一個數字類型:介於 -2^10242^1024 之間的 64 位元 IEEE 754-1985 雙精度浮點數。在 JavaScript 中儲存任何數字之前,JavaScript 會先將該數字轉換為二進位浮點數 (也稱為「浮點數」float)。

這個 64 位元儲存空間 (一個正數或負「符號」位元、為指數為 11 位元、分數為 52 位元) 會導致任何位數超出允許範圍內的精確度錯誤。這項限制取決於 JavaScript 數字資料類型。

0.1 + 0.7
> 0.7999999999999999

您可以將數字值儲存為「整數」,這個浮點數不用介於 -(2^53 − 1)2^53 − 1 之間。由於浮點數和整數是以相同的基本方式儲存,因此這些數字的運作方式沒有實質差異。但建議您盡可能使用整數,以免發生精確度錯誤。

數字運算子

當您搭配數字基元使用標準數學運算子時,系統會套用數學運算順序:系統會先評估任何用括號括住的運算式,後面接著指數、乘法、除法、加法和減法。

運算子 名稱 說明 用量 結果
+ 附加 2+2 4
- 減法 4-2 2
* 2*5 10
/ 部門 10/5 2
++ 遞增 將數字加到數字中 2++ 3
-- 減少 將數字從數字中減去 3-- 2
** 指數 傳回將第一個
運算元提高為第二個運算元次方的結果。
2**4 16
% 其餘
第一個運算元除以第二個運算元時,會傳回剩餘的餘數。
12%5 2

您也可以使用數學指派運算子,對變數值執行數學運算,然後立即將該新計算的值指派給變數。

運算子 名稱 用量
+= 新增指派作業 myValue += 2
-= 減量指派 myValue -= 2
*= 乘法指派 myValue *= 2
/= 部門分配 myValue /= 2
**= 指數指派 myValue **= 2
%= 其餘指派 myValue %= 2

符號值

數字基元也適用於幾個特殊情況:「非數字」值 (NaN),而值代表無限 (Infinity) 或負 (-Infinity) 的無限值。

您可能會因為除以零的結果而很少遇到 Infinity,這種情況下,大多數程式設計語言都會擲回錯誤:

10 / 0
> Infinity

請記住,JavaScript 區分大小寫。Infinity 是代表無限大概念的數字資料類型,但 infinity 沒有特殊意義:

Infinity
> Infinity

infinity
> Uncaught ReferenceError: infinity is not defined

NaN (也就是「不是數字」) 會更頻繁地顯示,在算術運算結果無法以數字表示的情況下。舉例來說,由於 JavaScript 會嘗試從值和結構定義推論資料類型,因此只有數字的字串常值才能用於數學運算:

"2" * 2;
> 4

但是,如果無法將該字串剖析為數值,則數學運算會產生非數字:

"two" * 2;
> NaN

當數學運算中的無效值以數字表示時,系統就會傳回 NaN。相關示例包括:

  • 失敗的轉換次數 (例如:parseInt( undefined ))
  • 結果不是實數的算術運算 (例如 0 / 0Math.sqrt( -10 ))
  • 帶有不確定結果的算術運算 (0 * Infinity)
  • 包含明確 NaN (NaN + 2) 或 NaN 結果 (2 * "string" / 2) 的算術運算

隨堂測驗

false 傳遞至 Number() 會有什麼結果?

0
NaN
1

下列數學運算的結果是什麼?

"Six" * 3

NaN
2
18
0