Number

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

Number 值表示浮點數,如 37-9.25

Number 建構函式包含用於處理數字的常量和方法。可以使用 Number() 函式將其他型別的值轉換為數字。

描述

數字最常以字面量形式表示,如 2553.14159詞法語法中有更詳細的參考。

js
255; // two-hundred and fifty-five
255.0; // same number
255 === 255.0; // true
255 === 0xff; // true (hexadecimal notation)
255 === 0b11111111; // true (binary notation)
255 === 0.255e3; // true (decimal exponential notation)

在 JavaScript 程式碼中,像 37 這樣的數字字面量是浮點值,而不是整數。在日常普遍使用中沒有單獨的整數型別。(JavaScript 還有一個 BigInt 型別,但它不是為取代日常使用的 Number 而設計的。37 仍然是一個 number,而不是一個 BigInt。)

當作為函式使用時,Number(value) 會將字串或其他值轉換為 Number 型別。如果該值無法轉換,則返回 NaN

js
Number("123"); // returns the number 123
Number("123") === 123; // true

Number("unicorn"); // NaN
Number(undefined); // NaN

數字編碼

JavaScript 的 Number 型別是雙精度 64 位二進位制格式 IEEE 754 值,類似於 Java 或 C# 中的 double。這意味著它可以表示小數值,但對於儲存的數字的大小和精度有一些限制。簡而言之,一個 IEEE 754 雙精度數字使用 64 位來表示 3 個部分:

  • 1 位用於符號(正或負)
  • 11 位用於指數(-1022 到 1023)
  • 52 位用於尾數(表示一個 0 到 1 之間的數字)

尾數(也稱為有效數)是數字中表示實際值(有效數字)的部分。指數是尾數應乘以的 2 的冪。可以把它想象成科學記數法:

Number=(1)符號(1+尾數)2指數\text{數字} = ({-1})^{\text{符號}} \cdot (1 + \text{尾數}) \cdot 2^{\text{指數}}

尾數用 52 位儲存,被解釋為二進位制小數 1.… 後面的數字。因此,尾數的精度為 2-52(可透過 Number.EPSILON 獲得),約為 15 到 17 位十進位制數字;超出此精度水平的算術運算會受到舍入的影響。

一個數字可以容納的最大值是 21023 × (2 - 2-52)(指數為 1023,尾數為二進位制的 0.1111…),可透過 Number.MAX_VALUE 獲得。高於此值的值將被特殊的數字常量 Infinity 所取代。

整數只能在 -253 + 1 到 253 - 1(包含)的範圍內無損精度地表示(可透過 Number.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGER 獲得),因為尾數只能容納 53 位(包括前導的 1)。

更多細節在 ECMAScript 標準中有描述。

數字強制轉換

許多期望數字的內建操作會首先將其引數強制轉換為數字(這在很大程度上是為什麼 Number 物件的行為與數字原始值相似)。該操作可以總結如下:

  • 數字按原樣返回。
  • undefined 變為 NaN
  • null 變為 0
  • true 變為 1false 變為 0
  • 字串透過像解析數字字面量一樣來轉換。解析失敗會得到 NaN。與實際的數字字面量相比,有一些微小的差異:
    • 前導和尾隨的空白/行終止符會被忽略。
    • 前導的 0 數字不會使數字變成八進位制字面量(或在嚴格模式下被拒絕)。
    • +- 允許出現在字串的開頭以表示其符號。(在實際程式碼中,它們“看起來像”是字面量的一部分,但實際上是獨立的一元運算子。)但是,符號只能出現一次,並且後面不能跟有空白。
    • Infinity-Infinity 被識別為字面量。在實際程式碼中,它們是全域性變數。
    • 空字串或只含空白的字串被轉換為 0
    • 不允許使用數字分隔符
  • BigInts 會丟擲 TypeError,以防止意外的隱式轉換導致精度損失。
  • Symbols 會丟擲 TypeError
  • 物件首先透過呼叫其 [Symbol.toPrimitive]()(以 "number" 為提示)、valueOf()toString() 方法(按此順序)轉換為原始值。然後將得到的原始值轉換為數字。

在 JavaScript 中有兩種方法可以實現幾乎相同的效果。

  • 一元加號+x 完全按照上面解釋的數字強制轉換步驟來轉換 x
  • Number() 函式:Number(x) 使用相同的演算法轉換 x,但 BigInts 不會丟擲 TypeError,而是返回它們的數值,可能會有精度損失。

Number.parseFloat()Number.parseInt()Number() 類似,但只轉換字串,並且解析規則略有不同。例如,parseInt() 不識別小數點,而 parseFloat() 不識別 0x 字首。

整數轉換

某些操作需要整數,最著名的是那些處理陣列/字串索引、日期/時間元件和數字基數的操作。在執行上述數字強制轉換步驟之後,結果會被截斷為整數(透過丟棄小數部分)。如果數字是 ±Infinity,它將按原樣返回。如果數字是 NaN-0,它將返回為 0。因此,結果總是一個整數(不是 -0)或 ±Infinity。

值得注意的是,當轉換為整數時,undefinednull 都會變成 0,因為 undefined 被轉換為 NaN,而 NaN 也變成了 0

定寬數字轉換

JavaScript 有一些處理整數二進位制編碼的底層函式,最著名的是位運算子TypedArray 物件。位運算子總是將運算元轉換為 32 位整數。在這些情況下,將值轉換為數字後,該數字會透過首先截斷小數部分,然後取整數的二進位制補碼編碼的最低位來規範化到給定的寬度。

js
new Int32Array([1.1, 1.9, -1.1, -1.9]); // Int32Array(4) [ 1, 1, -1, -1 ]

new Int8Array([257, -257]); // Int8Array(2) [ 1, -1 ]
// 257 = 0001 0000 0001
//     =      0000 0001 (mod 2^8)
//     = 1
// -257 = 1110 1111 1111
//      =      1111 1111 (mod 2^8)
//      = -1 (as signed integer)

new Uint8Array([257, -257]); // Uint8Array(2) [ 1, 255 ]
// -257 = 1110 1111 1111
//      =      1111 1111 (mod 2^8)
//      = 255 (as unsigned integer)

建構函式

Number()

建立 Number 物件。當作為函式呼叫時,它返回 Number 型別的原始值。

靜態屬性

Number.EPSILON

兩個可表示數字之間的最小間隔。

Number.MAX_SAFE_INTEGER

JavaScript 中的最大安全整數 (253 - 1)。

Number.MAX_VALUE

可表示的最大正數。

Number.MIN_SAFE_INTEGER

JavaScript 中的最小安全整數 (-(253 - 1))。

Number.MIN_VALUE

可表示的最小正數——即最接近於零的正數(但本身不是零)。

Number.NaN

特殊的“”(Not a Number)值。

Number.NEGATIVE_INFINITY

表示負無窮大的特殊值。在溢位時返回。

Number.POSITIVE_INFINITY

表示無窮大的特殊值。在溢位時返回。

靜態方法

Number.isFinite()

確定傳遞的值是否為有限數。

Number.isInteger()

確定傳遞的值是否為整數。

Number.isNaN()

確定傳遞的值是否為 NaN

Number.isSafeInteger()

確定傳遞的值是否為安全整數(介於 -(253 - 1) 和 253 - 1 之間的數字)。

Number.parseFloat()

這與全域性的 parseFloat() 函式相同。

Number.parseInt()

這與全域性的 parseInt() 函式相同。

例項屬性

這些屬性定義在 Number.prototype 上,並由所有 Number 例項共享。

Number.prototype.constructor

建立例項物件的建構函式。對於 Number 例項,初始值為 Number 建構函式。

例項方法

Number.prototype.toExponential()

以指數表示法返回表示該數字的字串。

Number.prototype.toFixed()

以定點表示法返回表示該數字的字串。

Number.prototype.toLocaleString()

返回此數字的語言敏感表示形式的字串。覆蓋 Object.prototype.toLocaleString() 方法。

Number.prototype.toPrecision()

以定點或指數表示法返回一個表示該數字並指定了精度的字串。

Number.prototype.toString()

以指定的基數返回表示指定物件的字串。覆蓋 Object.prototype.toString() 方法。

Number.prototype.valueOf()

返回指定物件的原始值。覆蓋 Object.prototype.valueOf() 方法。

示例

使用 Number 物件為數值變數賦值

以下示例使用 Number 物件的屬性為幾個數值變數賦值:

js
const biggestNum = Number.MAX_VALUE;
const smallestNum = Number.MIN_VALUE;
const infiniteNum = Number.POSITIVE_INFINITY;
const negInfiniteNum = Number.NEGATIVE_INFINITY;
const notANum = Number.NaN;

Number 的整數範圍

以下示例顯示了可以表示為 Number 物件的最小和最大整數值。

js
const biggestInt = Number.MAX_SAFE_INTEGER; // (2**53 - 1) => 9007199254740991
const smallestInt = Number.MIN_SAFE_INTEGER; // -(2**53 - 1) => -9007199254740991

當解析已序列化為 JSON 的資料時,如果整數值超出此範圍,當 JSON 解析器將其強制轉換為 Number 型別時,這些值可能會損壞。

一個可能的解決方法是使用 String

更大的數字可以使用 BigInt 型別來表示。

使用 Number() 轉換 Date 物件

以下示例使用 Number 作為函式將 Date 物件轉換為數值:

js
const d = new Date("1995-12-17T03:24:00");
console.log(Number(d));

這將輸出 819199440000

將數字字串和 null 轉換為數字

js
Number("123"); // 123
Number("123") === 123; // true
Number("12.3"); // 12.3
Number("12.00"); // 12
Number("123e-1"); // 12.3
Number(""); // 0
Number(null); // 0
Number("0x11"); // 17
Number("0b11"); // 3
Number("0o11"); // 9
Number("foo"); // NaN
Number("100a"); // NaN
Number("-Infinity"); // -Infinity

規範

規範
ECMAScript® 2026 語言規範
# sec-number-objects

瀏覽器相容性

另見