String(number)是否在内部调用number.toString?

时间:2016-11-28 06:40:38

标签: javascript prototype tostring

我只是想尝试一下并找到了这个:

如果您在自定义String(n)内拨打toString,则会自行调用并抛出错误Maximum Call Stack exceeded

JSFiddle



Number.prototype.toString = function() {
  return String(this)
}

var a = 10;
try {
  a.toString()
} catch (err) {
  console.log(err.message)
}




但如果您直接致电var b = String(a),则不会调用toString函数。

JSFiddle



Number.prototype.toString = function(){
  console.log(this);
  return '' + this;
}

var a = 10;
a.toString();




注意:我知道上面的代码段也出现了同样的错误,但我已经检查了Nodechrome - JSFiddleFirefox - JSFiddle,这是一致的。 var b = String(a)不会致电number.toString()'' + this也不会。这是Stack片段中的一些优化,它在number.toString()上调用''+this

所以我的问题是,我错过了什么?为什么这种奇怪的行为?

2 个答案:

答案 0 :(得分:3)

实际数字调用内部方法将其转换为字符串,其输出不受valueOftoString的影响,除非明确调用它们。

那么为什么toString首先被调用呢?

这是因为"马虎" (非严格)模式,this的值将被转换为其对象形式(即等同于new Number(10)),然后传递给String(this)'' + this

(因此,在使用严格模式的普通应用程序中,您可能看不出这两种方式的区别。)

由于this是一个对象,String()+加法运算符都会尝试将对象转换为字符串。这通常是通过调用obj.toStringobj.valueOf来完成的。

至于为什么String(this)失败但'' + this没有失败,String函数会在调用toString之前调用对象valueOf

但是,当您使用添加(+)运算符时,valueOftoString的顺序会相反。

答案 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)
}




我认为是The reason to use JS .call() method?

的原因