Найти тему

Строки в JavaScript - объекты или переменные?

Пожалуй, заголовок статьи не совсем верный. Правильнее было бы сказать - “объект или элементарный тип данных”. Но я решил сделать попроще. Поэтому получилось так, как получилось )))

Наверняка, если вы хотя бы немного знаете JavaScript, вы встречали что-то подобное:

var len = 0;
var s = 'Hello!';
len = s.length; //len = 6

Здесь мы объявили и инициализировали строковую переменную, а потом получили длину строки с помощью свойства length. Но, раз у переменной s есть свойства, значит, это объект?

А вот и нет. Если мы проверим тип переменной s с помощью оператора typeof, то получим string. То есть строковая переменная - это никакой не объект. Это элементарный тип данных. Но почему же тогда он ведёт себя как объект?

Оказывается, когда мы используем объектно-ориентированный подход, то JavaScript автоматически создаёт новый временный объект String, позволяющий обращаться к свойствам, таким как length. После использования этот объект удаляется, не меняя исходного значения переменной, для которой этот объект создавался.

Если же вы захотите явно использовать объект String в своей программе, надо создать постоянный объект, который не будет автоматически удаляться:

var S = new String('Hello!');

Теперь с переменной S можно работать как с объектом. Хотя она как бы остаётся строкой. И если обычная строковая переменная и объектная строковая переменная содержат одинаковый текст, то вот такое выражение:

S == s

будет истинным. Но здесь надо помнить, что мы сравниваем разные типы. Поэтому вот такое выражение:

S === s

уже вернёт false. Потому что S и s равны, но не идентичны.

В остальном же разницы между строками-переменными и строками-объектами нет. Потому что строковые типы, как уже было сказано, автоматически преобразуются в объекты, если это необходимо.

Кстати, обратное преобразование - из объекта в строку - тоже возможно:

var msg = '';
var S = new String('Hello!');
msg = S + '!!';

Здесь при записи значения переменной S в переменную msg, объектная переменная сначала преобразуется в строковую, потом складывается со строкой '!!', а затем итог записывается в msg. После чего S обратно преобразуется в объект. А msg при этом остаётся строковой переменной.

Ну и в заключение остаётся добавить, что всё сказанное про объект String также справедливо и для числовых и для логических объектов (Number и Boolean). Пример с числами можно найти здесь. По логическим типам всё работает примерно так же.

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.