我只是想尝试一下并找到了这个:
如果您在自定义String(n)
内拨打toString
,则会自行调用并抛出错误Maximum Call Stack exceeded
,
Number.prototype.toString = function() {
return String(this)
}
var a = 10;
try {
a.toString()
} catch (err) {
console.log(err.message)
}

但如果您直接致电var b = String(a)
,则不会调用toString
函数。
Number.prototype.toString = function(){
console.log(this);
return '' + this;
}
var a = 10;
a.toString();

注意:我知道上面的代码段也出现了同样的错误,但我已经检查了Node
,chrome - JSFiddle
和Firefox - JSFiddle
,这是一致的。 var b = String(a)
不会致电number.toString()
,'' + this
也不会。这是Stack片段中的一些优化,它在number.toString()
上调用''+this
。
所以我的问题是,我错过了什么?为什么这种奇怪的行为?
答案 0 :(得分:3)
实际数字调用内部方法将其转换为字符串,其输出不受valueOf
和toString
的影响,除非明确调用它们。
那么为什么toString
首先被调用呢?
这是因为"马虎" (非严格)模式,this
的值将被转换为其对象形式(即等同于new Number(10)
),然后传递给String(this)
或'' + this
。
(因此,在使用严格模式的普通应用程序中,您可能看不出这两种方式的区别。)
由于this
是一个对象,String()
和+
加法运算符都会尝试将对象转换为字符串。这通常是通过调用obj.toString
或obj.valueOf
来完成的。
至于为什么String(this)
失败但'' + this
没有失败,String
函数会在调用toString
之前调用对象valueOf
。
但是,当您使用添加(+
)运算符时,valueOf
和toString
的顺序会相反。
答案 1 :(得分:0)
可能你应该使用电话/申请。
Number.prototype.toString = function() {
console.log(this)
return String(this)
}
var a = 10;
try {
a.toString.call()
console.log(a)
} catch (err) {
console.log(err.message)
}

的原因