{BigInt,Number}.fromString S1
- Stage: Stage 1
- Status: Active
- ECMAScript edition: —
- Synchronized: Aug 28, 2026
- 中文译文 · Source repository
This proposal introduces static fromString methods on Number and BigInt that reverse their toString methods, addressing the shortcomings of parseInt such as returning NaN for invalid input and lacking support for certain radixes. The proposed API throws appropriate errors (SyntaxError, RangeError, TypeError) for invalid strings, invalid radix, or non-string inputs, and deliberately ignores integer literal prefixes and separators.
The README below comes from the upstream repository and may contain outdated stage or status metadata. Use the proposal details above as the current source of truth.
ECMAScript proposal: {BigInt,Number}.fromString
Status
This proposal is at stage 1 of the TC39 process.
Background
The BigInt proposal initially included a static BigInt.parseInt method. After some discussion, it was removed in favor of a separate proposal to add a static fromString method to both BigInt and Number. This is that proposal.
Motivation
{BigInt,Number}.prototype.toString(radix) enables converting a numeric value into a string representation of that value. For BigInts specifically, there is currently no built-in way to do the inverse, i.e. to turn a string representation of a BigInt with a given radix back into a BigInt.
For Number values, there is parseInt(string, radix = 10) and Number.parseInt(string, radix = 10), but its behavior is suboptimal:
- It returns
NaNinstead of throwing aSyntaxErrorexception whenstringdoes not represent a number. - It returns
NaNinstead of throwing aRangeErrorexception whenradixis not valid (i.e.radix !== 0 && radix < 2orradix > 36). - It accepts radix
0, treating it as10instead, which does not make sense. - It ignores leading whitespace and trailing non-digit characters.
- It supports hexadecimal integer literal prefixes
0xand0Xbut lacks support for octal integer literal prefixes0oand0Oor binary integer literal prefixes0band0B, which is inconsistent. - The fact that
parseInthas some level of support for integer literal prefixes means that it’s not a clear counterpart totoString.
Proposed solution
We propose extending both BigInt and Number with a new static fromString(string, radix = 10) method which acts as the inverse of {BigInt,Number}.prototype.toString(radix = 10). It accepts only strings that can be produced by {BigInt,Number}.prototype.toString(radix = 10), and throws an exception for any other input.
High-level API
Illustrative examples
The following examples use Number.fromString. The semantics for BigInt.fromString are identical except it returns a BigInt rather than a Number.
Unlike parseInt, fromString intentionally lacks special handling for integer literal prefixes.
Unlike parseInt, fromString throws a SyntaxError exception when string does not represent a number.
Unlike parseInt, fromString throws a RangeError exception when radix < 2 or radix > 36.
Unlike parseInt, fromString throws a TypeError exception when string is not a string.
FAQ
What about legacy octal integers?
fromString intentionally lacks special handling for legacy octal integer literals, i.e. those without the explicit 0o or 0O prefix such as 010. In other words, Number.fromString('010') throws a SyntaxError exception.
What about numeric separators?
fromString does not need to support numeric separators, as they cannot occur in {BigInt,Number}.prototype.toString(radix) output. Number.fromString('1_000_000_000') throws a SyntaxError exception.
Does BigInt.fromString(string) support the n suffix?
BigInt.fromString does not need to support the n suffix used for BigInt literals, as it doesn’t occur in BigInt.prototype.toString(radix) output. Furthermore, supporting it would introduce an ambiguity for radices where n is a valid digit: should BigInt.fromString('1n', 32) return 1 or 55? With the current proposal, BigInt.fromString('1n', 32) returns 55, and BigInt.fromString('1n') throws a SyntaxError exception.
Specification
Implementations
- none yet