与 Number、Boolean 和 String 不同,为什么 BigInt 不是构造函数?

Ben*_*Ben 3 javascript

Number、Boolean和String是与这些基本类型相对应的构造函数。

BigInt是对应于 BigInt 基元类型的函数,但它不是构造函数。

new BigInt(1n) // Uncaught TypeError: BigInt is not a constructor
Run Code Online (Sandbox Code Playgroud)

为什么?

T.J*_*der 5

Symbol新基元类型 ( 、 )的函数BigInt不会获得构造签名,因为 TC39 认为它们不需要它们。关于该BigInt提案的问题,Jordan Harband(TC39 成员、规范前编辑)表示:

就像 一样,与产生原语的东西一起Symbol使用是没有意义的。new由于BigInt(like Symbol) 是原语,因此它只能作为函数调用。

不幸的是,ES6 之前的原始构造函数必须保留它们的new- 能力,以实现向后兼容。

以及来自这个(也是约旦):

...用户永远不应该new与Number对象一起使用,因为人们普遍认为使用盒装基元是一种非常糟糕的做法。

新的范例(没有双关语)如下Symbol- 如果你想要一个对象,你必须显式地将原语传递到Object. new Primitive()是一把步枪,新的原语不应该延续这种遗留模式。

new String等的用例非常少且相差很远(如果甚至有任何不能通过其他方式更好地解决的话)。具有NumberandString的构造签名Boolean会令人困惑(您是仅使用文字创建字符串,还是使用new String?为什么它new String("x") === "x"是 false?等等)。看起来委员会决定避免与较新的原语发生这种混淆。(它们仍然有对象对应物,只是如何获取它们稍微不太明显,因此不太可能引起混乱。)