Где хранится строка 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. Детали немного длинны, но они начинаются следующим образом:
- Если
m
является NaN
, верните строку "NaN"
. - Если
m
- +0
или -0
, верните строку "0"
. - ...
как вы можете видеть, это очень конкретные инструкции о том, как преобразовать 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 не вызывается. Вместо этого его значение разрешено и используется для оценки остальной части выражения.