Где хранится строка String of Number?

Например, код.

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 Number или других неизменяемых типов, которые хранятся и вызывается при преобразовании типов.

Ответ 1

Таким образом, вопрос заключается в том, где toString числа или других неизменяемых типов, которые хранятся и вызываются при преобразовании типов

Он хранится на Number.prototype. Более важный вопрос:

Как число преобразуется в строку при выполнении 1 + 'a'?

Не через метод toString !

Метод toString используется только при преобразовании объекта в примитивное значение. Однако число уже является примитивным значением. Вместо этого существует внутренняя процедура ToString которая вызывается для преобразования числа в строку. Подробности можно найти в спецификации ES2017 по 12.8.3, 7.7.12 и 7.1.12.1. Детали немного длинны, но они начинаются следующим образом:

  1. Если m является NaN, верните строку "NaN".
  2. Если m - +0 или -0, верните строку "0".
  3. ...

как вы можете видеть, это очень конкретные инструкции о том, как преобразовать Number.prototype.toString значение в строку, которая не имеет никакого отношения к фактическому методу toString определенному в Number.prototype.toString.

Ответ 2

Проблема здесь не в Number.prototype; его просто то, что Number.prototype.toString не Number.prototype.toString при преобразовании чисел в строки. JavaScript использует внутреннюю операцию ToString для преобразования строк и имеет особое поведение для примитивов.

Number: Return NumberToString (аргумент).

Ответ 3

JavaScript не использует toString для преобразования примитивных типов данных в строку. Он использует свою собственную реализацию. По сути, все приведенные ниже примеры следуют вашему примеру:

let a = 1, b = 'string', c = false, d = 100.5, e = {}
a.__proto__.toString = _ => 'test'
b.__proto__.toString = _ => 'test'
c.__proto__.toString = _ => 'test'
d.__proto__.toString = _ => 'test'
e.__proto__.toString = _ => 'test'

console.log(a + 'X', b + 'X', c + 'X', d + 'X', e + 'X')

Ответ 4

Он хранится как свойство прототипа...

Помните, что число - это число. Когда вы используете его для оценки в выражении, например с оператором +, его метод toString не вызывается. Вместо этого его значение разрешено и используется для оценки остальной части выражения.