数字与新数字内部实施

时间:2018-10-17 14:29:52

标签: javascript object constructor primitive

我了解写作

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引擎是否将这些表达式解析为语言的一项特殊功能?还是程序员也可以根据构造器是否使用“新”调用而“重载”构造器函数以返回基元或对象?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

enter image description here

答案 1 :(得分:1)

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

您也可以这样做:

function MyConstructor() {
  if (!this) return new MyConstructor();
  // stuff ...
}

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

此外,构造函数可以返回某些内容。如果返回一个对象,则使用该对象代替new创建的隐式构造的对象。因此,您还可以通过另一种方式实现“ new-is-optional”构造函数:

function MyConstructor() {
  let object = this || Object.create(MyConstructor.prototype);
  // stuff ...
  return object;
}

因此Number()构造函数采用了不同的方法。在大多数运行时中,它实际上可能会或可能不会实现为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"
}