javascript: есть ли у примитивных строк методы?

MDN указывает:

примитивное, примитивное значение

Данные, которые не являются объектом и не имеют методов. JavaScript имеет 5 примитивных типов данных: строка, число, логическое значение, нуль, неопределенный. За исключением null и undefined, все значения примитивов имеют эквиваленты объектов, которые обертывают значения примитивов, например. объект String оборачивает строковый примитив. Все примитивы неизменяемы.

Итак, когда мы называем "s".replace или "s".anything, это эквивалентно new String("s").replace и new String("s").anything?


person Pacerier    schedule 22.04.2011    source источник


Ответы (2)


Нет, у строковых примитивов нет методов. Как и в случае с числовыми примитивами, среда выполнения JavaScript будет продвигать их к полноценным объектам «String», когда это будет вызвано такими конструкциями, как:

var space = "hello there".indexOf(" ");

В некоторых языках (ну, в частности, в Java, но я думаю, что этот термин широко используется) говорят, что язык «упаковывает» примитивы в их объектные оболочки, когда это необходимо. С числами немного сложнее из-за причуд грамматики токенов; ты не можешь просто сказать

var foo = 27.toLocaleString();

поскольку "." не будет интерпретироваться так, как вам нужно; Однако:

var foo = (27).toLocaleString();

работает отлично. Если на то пошло, со строковыми примитивами и логическими значениями грамматика не является двусмысленной, например:

var foo = true.toString();

будет работать.

person Pointy    schedule 22.04.2011
comment
Эй, кстати, это стандарт синтаксиса с двойной точкой? Как 27..toLocaleString() - person Pacerier; 22.04.2011
comment
Что ж, по крайней мере, в Chrome это работает... проблема в том, что низкоуровневая грамматика токена перехватывает первый файл . на число из-за того, как выглядят числа с плавающей запятой (23.223). Но этот трюк с двумя точками должен сработать, потому что токенизатор остановится на втором ., предоставив синтаксическому анализатору возможность построить выражение ссылки на свойство. - person Pointy; 22.04.2011
comment
Лично я предпочел бы (27).toLocaleString(), потому что легко потерять немного . застрял там. Но это всего лишь стилистическое мнение, и оно мало чего стоит :-) - person Pointy; 22.04.2011
comment
Первая точка после цифры — это десятичная точка. Все браузеры всегда соглашались с тем, что 12..toLocaleString() работает с номером. - person kennebec; 22.04.2011
comment
@kennebec это имеет смысл, спасибо; Я лично не отслеживал последние десять лет, но это, безусловно, имеет смысл, учитывая грамматику токенов и т. Д. :-) - person Pointy; 22.04.2011
comment
Это автоматическое продвижение примитивных значений к обернутым объектам явно указано в спецификации? - person wlnirvana; 20.04.2021
comment
Я думаю, что ответ на мой предыдущий комментарий - да. См. эту запись. - person wlnirvana; 20.04.2021

Технически правильный ответ — «нет».

Реальный ответ: «Нет, но это все равно будет работать». Это потому, что когда вы делаете что-то вроде

"s".replace()

интерпретатор знает, что вы хотите фактически работать со строкой, как если бы вы создали ее с помощью

var str = new String("s")

и поэтому действует так, как будто вы это сделали.

person helloandre    schedule 22.04.2011