Javascript 数字串存储在哪里?

Javascript 数字串存储在哪里?,javascript,Javascript,例如,一些代码 let a = 1 a.__proto__.toString = function(){ return 'test'} a.toString() //"test" a + '2' //"12" 我真的不明白toString方法存储在哪里。 如果我对我得到的可变对象这样做 let o = {} o.__proto__.toString = function(){ return 'test'} o.toString() //"test" o + '2' //"test2" 正如我

例如,一些代码

let a = 1
a.__proto__.toString = function(){ return 'test'}
a.toString()
//"test"
a + '2'
//"12"
我真的不明白
toString
方法存储在哪里。 如果我对我得到的可变对象这样做

let o = {}
o.__proto__.toString = function(){ return 'test'}
o.toString()
//"test"
o + '2'
//"test2"
正如我所预料的那样。
所以问题是,当类型转换发生时,在哪里存储和调用
toString
或其他不可变类型。

它存储为原型的属性


记住,数字就是数字。当您使用它在表达式中求值时,例如使用运算符+,它的toString方法不会被调用。相反,它的值被解析,并用于计算表达式的其余部分。

这里的问题不在于编号;只是将数字转换为字符串时没有调用
Number.prototype.toString
。JavaScript用于字符串转换,并且对原语有特殊的行为

Number:返回NumberToString(参数)

所以问题是,当类型转换发生时,数字或其他不可变类型的字符串存储在哪里并被调用

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

执行
1+'a'
时,数字如何转换为字符串

不是通过
toString
方法

toString
方法仅在将对象转换为基本值时使用。但是,数字已经是基本值。相反,有一个内部
ToString
例程被调用以将数字转换为字符串。有关详细信息,请参见ES2017规范,网址:和。细节有点长,但开头是这样的:

  • 如果
    m
    NaN
    ,则返回字符串
    “NaN”
  • 如果
    m
    +0
    -0
    ,则返回字符串
    “0”

  • 如您所见,这些是关于如何将数字值转换为字符串的非常具体的说明,与
    number.prototype.toString上定义的实际
    toString
    方法无关。toString

    JavaScript不使用
    toString
    将原始数据类型转换为字符串。信息技术事实上,以下所有示例都是以您为例的:

    设a=1,b='string',c=false,d=100.5,e={}
    a、 _uuuproto_uuuu.toString=>'test'
    b、 _uuuproto_uuuu.toString=>'test'
    c、 _uuuproto_uuuu.toString=>'test'
    d、 _uuuproto_uuuu.toString=>'test'
    e、 _uuuproto_uuuu.toString=>'test'
    
    console.log(a+'X',b+'X',c+'X',d+'X',e+'X')
    @Ry当
    toString
    被设置为那样时,
    Number.prototype.toString
    被设置,我刚刚检查过
    toString
    valueOf
    仅为对象调用。对于
    a=1
    a
    是一个基本值,而不是一个对象。@niceman:我想了一会儿,问题是
    a.\uuuuuuuuuuuuuuuuuuu
    是什么。