我明白你写的
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“调用的?
发布于 2018-10-17 22:38:17
使用构造函数,Number对象将是一个对象,而使用函数Number将把对象转换为其表示形式的数值。
因此,基本上在Number对象中,该函数将验证调用方式。这可以通过检查object 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

发布于 2018-10-17 22:32:45
它与语法无关,这些构造函数也没有什么特别之处。在继续之前,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"
}https://stackoverflow.com/questions/52857364
复制相似问题