Number
Number 值表示浮點數,如 37 或 -9.25。
Number 建構函式包含用於處理數字的常量和方法。可以使用 Number() 函式將其他型別的值轉換為數字。
描述
數字最常以字面量形式表示,如 255 或 3.14159。詞法語法中有更詳細的參考。
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。
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 的冪。可以把它想象成科學記數法:
尾數用 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_INTEGER 和 Number.MAX_SAFE_INTEGER 獲得),因為尾數只能容納 53 位(包括前導的 1)。
更多細節在 ECMAScript 標準中有描述。
數字強制轉換
許多期望數字的內建操作會首先將其引數強制轉換為數字(這在很大程度上是為什麼 Number 物件的行為與數字原始值相似)。該操作可以總結如下:
- 數字按原樣返回。
undefined變為NaN。null變為0。true變為1;false變為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。
值得注意的是,當轉換為整數時,undefined 和 null 都會變成 0,因為 undefined 被轉換為 NaN,而 NaN 也變成了 0。
定寬數字轉換
JavaScript 有一些處理整數二進位制編碼的底層函式,最著名的是位運算子和 TypedArray 物件。位運算子總是將運算元轉換為 32 位整數。在這些情況下,將值轉換為數字後,該數字會透過首先截斷小數部分,然後取整數的二進位制補碼編碼的最低位來規範化到給定的寬度。
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 物件的屬性為幾個數值變數賦值:
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 物件的最小和最大整數值。
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 物件轉換為數值:
const d = new Date("1995-12-17T03:24:00");
console.log(Number(d));
這將輸出 819199440000。
將數字字串和 null 轉換為數字
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 |
瀏覽器相容性
載入中…