首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Number vs new Number内部实现

Number vs new Number内部实现
EN

Stack Overflow用户
提问于 2018-10-17 22:29:52
回答 2查看 42关注 0票数 2

我明白你写的

代码语言:javascript
复制
var x = Number("7"); // makes a number, a primitive
var y = new Number("7"); // makes a Number object

我知道通常对选项2的警告,但幕后发生了什么?我的印象是,如果一个函数是一个构造函数,它不应该通过return语句返回值:它只是设置它的隐式对象this,然后返回它。

那么为什么Number、String和Boolean构造函数能够返回原语或对象呢?作为语言中的一个特殊功能,JavaScript引擎是否会以不同的方式解析这些表达式?或者,程序员是否也可以“重载”构造函数以返回原语或对象,这取决于构造函数是用还是不用"new“调用的?

EN

回答 2

Stack Overflow用户

发布于 2018-10-17 22:38:17

使用构造函数,Number对象将是一个对象,而使用函数Number将把对象转换为其表示形式的数值。

因此,基本上在Number对象中,该函数将验证调用方式。这可以通过检查object this来实现。

有趣的是,将Number 对象强制转换为数字值,如下所示:

代码语言:javascript
复制
var x = Number("7"); // makes a number, a primitive
var y = new Number("7");

console.log(x === +y)

访问并阅读有关规范的信息

https://www.ecma-international.org/ecma-262/5.1/#sec-15.7

票数 2
EN

Stack Overflow用户

发布于 2018-10-17 22:32:45

它与语法无关,这些构造函数也没有什么特别之处。在继续之前,Number()和其他构造函数只是测试this是否被绑定。

你也可以这样做:

代码语言:javascript
复制
function MyConstructor() {
  if (!this) return new MyConstructor();
  // stuff ...
}

现在,调用MyConstructor()的行为将与new MyConstructor()完全一样。

此外,构造函数也可以返回一些东西。如果返回一个对象,则使用该对象而不是new创建的隐式构造的对象。因此,您还可以通过另一种方式实现"new-is-optional“构造函数:

代码语言:javascript
复制
function MyConstructor() {
  let object = this || Object.create(MyConstructor.prototype);
  // stuff ...
  return object;
}

因此,Number()构造函数采取了不同的策略。在大多数运行时中,它可能被实现为JavaScript,也可能不被实现,但如果是这样的话,它可能看起来像这样:

代码语言:javascript
复制
function Number(n) {
  if (this) {
    // invoked with "new"
    this.fantasyValueSetter(n); // cannot really do this
    return this;
  }
  return +n; // plain number primitive if not invoked with "new"
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52857364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档