Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Правда ли строки в JavaScript неизменяемы? (https://javascript.ru/forum/misc/23270-pravda-li-stroki-v-javascript-neizmenyaemy.html)

Bbore 18.11.2011 14:33

Правда ли строки в JavaScript неизменяемы?
 
У Фленагана написано, что строки в JavaScript неизменяемые. Как-то никогда не заострял на этом внимания...

Но почему тогда работает код:
var s1 = "hello";
var s2 = "hell" + "o";
s2 = s2 + "o";

Ведь я не переопределяю, а изменяю переменную...:-?

Nekromancer 18.11.2011 15:02

Цитата:

Сообщение от Bbore (Сообщение 137403)
Ведь я не переопределяю, а изменяю переменную...:-?

Переменную изминить нельзя. Переменная всего лишь ссылкается на какой то тип данных. Причём вы даже не меняете тип данных - строку, а складываете две строки и в итоге результат операции - новая строка.
Ну и собственно как написали выше :) Строка почти буффер. А возможно и в реализациях движков это так и есть.

B~Vladi 18.11.2011 15:51

Цитата:

Сообщение от nasqad
обьект String - readonly

False:

var str = new String('value');
str.prop = 'prop value';
alert(str.prop);

Nekromancer 18.11.2011 17:52

Таки реальное значение строки не поменять, наверно это имел введу человек. Хотя если брать примитив, то там естественно и обычное свойство невозможно присвоить.

B~Vladi 18.11.2011 19:37

Вот это правильное объяснение. Даже в объекте String нельзя. Но можно делать хитро:
var str = new String('data'),
  data;

str.toString = function(){
  return data || ''.toString.call(this);
};

alert(str);
data = 'newData';
alert(str);


Т.е. можно использовать один объект, но значения он может возвращать разные.

Nekromancer 18.11.2011 21:36

Интересно, но вряд ли применимо. Скорее даже бессмысленно. Разве что в каком нибудь особом приложении нужна возможность выводить строки разных форматах/кодировках, или ещё что то с ними там проворачивать. Тогда можно реализовать через прототип, правда тоже сомнительно.

Aetae 18.11.2011 21:43

B~Vladi, В этом я вижу только способ жестоко вы*ть мозги прогеру-недругу в команде.))

trikadin 18.11.2011 21:49

B~Vladi, это как #define true false в С. Убей дебаггера))

B~Vladi 18.11.2011 21:54

Aetae, если это документировано, или скрыто в нутрях твоего API, то никаких проблем не возникнет.
Цитата:

Сообщение от Nekromancer
Интересно, но вряд ли применимо.

Не стоит придумывать нереальных задач. Нужно только помнить о том, что JS не строго-типизированный язык и когда объект преобразуется в текстовое значение - для этого вызывается нативный метод toString, который можно изменить. Если ты не поленишься и вникнешь в эти исходники, то поймешь, что это достаточно юзабельный вариант. Мне он очень помог и решения лучше я не придумал.
Если лень - могу объяснить.

B~Vladi 18.11.2011 21:57

Цитата:

Сообщение от trikadin
это как #define true false в С. Убей дебаггера))

Я не знаю СИ, но суть понятна. Вообще, про СИ говорят, что это опасный язык, так что там много чего можно наворотить :)


Часовой пояс GMT +3, время: 14:13.