存储的数字字符串在哪里?

Але*_*кин 21 javascript

有些代码例如.

let a = 1
a.__proto__.toString = function(){ return 'test'}
a.toString()
//"test"
a + '2'
//"12"
Run Code Online (Sandbox Code Playgroud)

我真的无法理解toString方法存储在哪里.如果我用可变对象做到这一点,我得到了

let o = {}
o.__proto__.toString = function(){ return 'test'}
o.toString()
//"test"
o + '2'
//"test2"
Run Code Online (Sandbox Code Playgroud)

这符合我的预期.所以,问题是,其中toStringNumber或其他不变类型存储并调用时类型转换发生.

Fel*_*ing 28

所以问题是在发生类型转换时存储和调用的toString of Number或其他不可变类型

它存储在Number.prototype.更重要的问题是:

在做1 + 'a'什么时,如何将数字转换为字符串?

不是通过toString方法!

toString方法仅在将对象转换为原始值时使用.但是,一个数字已经是一个原始值.相反,有一个内部 ToString例程被调用以将数字转换为字符串.详细信息可以在ES2017规范被发现在12.8.3,7.7.127.1.12.1.细节有点长,但它是这样开始的:

  1. 如果mNaN,则返回String "NaN".
  2. 如果m+0-0,则返回String "0".
  3. ...

正如您所看到的,这些是关于如何将数字值转换为字符串的非常具体的说明,这与指定的实际toString方法无关Number.prototype.toString.