我了解写作
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引擎是否将这些表达式解析为语言的一项特殊功能?还是程序员也可以根据构造器是否使用“新”调用而“重载”构造器函数以返回基元或对象?
答案 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)
开始阅读有关规范
答案 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"
}