为什么可以';JavaScript构造函数创建字符串还是数字?

为什么可以';JavaScript构造函数创建字符串还是数字?,javascript,Javascript,假设我有一些构造函数: function Foo() { } function FooObject() { return {} } function FooArray() { return [] } function FooFunction() { return function () {} } function FooString() { return '' } function FooNumber() { return 1337 } 我用它们来创建一些对象: new Foo() // cr

假设我有一些构造函数:

function Foo() { }
function FooObject() { return {} }
function FooArray() { return [] }
function FooFunction() { return function () {} }
function FooString() { return '' }
function FooNumber() { return 1337 }
我用它们来创建一些对象:

new Foo() // creates Foo instance
new FooObject() // creates object
new FooArray() // creates array
new FooFunction() // creates function
这些都是有道理的,但字符串和数字最终只是作为实例,为什么

new FooString() // creates FooString instance: WAT
new FooNumber() // creates FooNumber instance: WAT

这是为什么?

以下是您感兴趣的行为描述:

调用函数对象F的[[Construct]]属性时 采取了以下步骤:

  • 创建新的本机ECMAScript对象
  • 将结果(1)的[[Class]]属性设置为“Object”
  • 获取F的prototype属性的值
  • 如果结果(3)是对象,则将结果(1)的[[Prototype]]属性设置为结果(3)
  • 如果结果(3)不是对象,请将结果(1)的[[Prototype]]属性设置为原始对象Prototype对象,如中所述 15.2.3.1
  • 调用F的[[Call]]属性,提供结果(1)作为this值,并提供传入[[Construct]]的参数列表作为 参数值
  • 如果类型(结果(6))是对象,则返回结果(6)。
  • 返回结果(1)

  • JavaScript中的字符串和数字是不可变的。而且,由于
    new
    操作符实例化了一个作为给定构造函数实例的新对象,因此得到的是一个对象而不是原语值。如果在没有
    new
    操作符的情况下调用这些函数,您将获得预期的基本值


    请参阅。

    只是一个问题:您是否有意和有意识地使用
    new
    ?看,这不是一个沉重的问题;我只是想让你意识到它的含义。。。首先,不要那样做。构造函数应该用于创建构造函数类型的实例,而不是返回原语。从构造函数返回原语没有任何意义。。。构造函数返回对象。
    function FooString(){返回新字符串(“”)}
    :)@Cuberto这不是问题所在。我知道没有理由这么做。我想问的是,为什么语言会有这样的表现。这里最重要的是第7步。可能值得强调;)“new操作符总是实例化一个新对象,该对象是给定构造函数的实例”--你确定吗?