Number
, Boolean
and String
are constructor functions that correspond to those primitive types.
BigInt
is a function that corresponds to the BigInt primitive type, but it is not a constructor function.
new BigInt(1n) // Uncaught TypeError: BigInt is not a constructor
Why?
>Solution :
The functions for new primitive types (Symbol
, BigInt
) don’t get construction signatures because TC39 doesn’t think they need them. On this issue on the BigInt
proposal, Jordan Harband (TC39 member and former editor of the specification) said:
Just like
Symbol
, it doesn’t make sense to usenew
with things that produce a primitive. SinceBigInt
(likeSymbol
) is a primitive, it should only be invoked as a function.Pre-ES6 primitive constructors unfortunately must retain their
new
-ability, for back compat.
and from this one (also Jordan):
…users should never use
new
with aNumber
object tho, because it’s widely considered a very bad practice to ever use boxed primitives.The new paradigm (no pun intended) is the one
Symbol
follows – if you want an object, you have to explicitly pass the primitive intoObject
.new Primitive()
is a footgun, and new primitives should not continue this legacy pattern.
The use cases for new String
, etc., are very few and far between (if there even are any that aren’t better solved in other ways). Having construction signatures for Number
and String
and Boolean
is confusing (do you create a string just by using a literal, or by using new String
? why is it new String("x") === "x"
is false? etc.). It looks like the committee decided to avoid that kind of confusion with newer primitives. (They still have object counterparts, it’s just slightly less obvious how you get them, making it less likely to cause confusion.)