Как упоминалось ранее, строки не вписываются в двухполярный элементарно_ ссылочный мир. Поскольку строки не являются объектами, вполне естественно предположить, что они относятся к элементарному типу. Если строки рассмат_ ривать как элементарный тип данных, тогда в соответствии с описанными выше правилами операции над ними должны производиться по значению. Но по_ скольку строки могут иметь произвольную длину, это может приводить к непро_ изводительному расходованию системных ресурсов на операции копирования и побайтового сравнения. Таким образом, не менее естественно было бы предпо_ ложить, что строки реализованы как ссылочный тип данных.
Вместо того чтобы строить предположения, можно попробовать написать не_ большой фрагмент на языке JavaScript и решить проблему экспериментальным путем. Если строки копируются и передаются по ссылке, должна иметься воз_ можность изменять их содержимое с помощью ссылки, хранящейся в другой пе_ ременной, или в результате передачи строки в функцию.
Однако при попытке написать такой фрагмент для проведения эксперимента вы столкнетесь с серьезной проблемой: в JavaScript невозможно изменить содержи_ мое строки. Существует метод charAt(), который возвращает символ из заданной позиции в строке, но нет соответствующего ему метода setCharAt(), позволяюще_ го ввести в эту позицию другой символ. Это не упущение. Строки в JavaScript
66 Глава 3. Типы данных и значения
преднамеренно неизменяемы – в JavaScript отсутствуют элементы языка, с по_ мощью которых можно было бы изменять символы в строке.
Поскольку строки являются неизменяемыми, вопрос остается открытым, т. к. нет никакого способа проверить, как передаются строки – по ссылке или по зна_ чению. Можно предположить, что с целью повышения эффективности интер_ претатор JavaScript реализован так, чтобы строки передавались по ссылке, но это так и останется всего лишь предположением, поскольку нет возможности проверить его экспериментально.