| 
	| 
	
	| 
		
	| 
			
			 
			
				18.11.2011, 14:33
			
			
			
		 |  
	| 
		
			
			| Новичок на форуме       |  | 
					Регистрация: 18.11.2011 
						Сообщений: 2
					 
		
 |  |  
	| 
				Правда ли строки в JavaScript неизменяемы?
			 У Фленагана написано, что строки в JavaScript неизменяемые.  Как-то никогда не заострял на этом внимания... 
Но почему тогда работает код:
 
var s1 = "hello";
var s2 = "hell" + "o";
s2 = s2 + "o";
 
Ведь я не переопределяю, а изменяю переменную...  |  |  
	| 
		
	| 
			
			 
			
				18.11.2011, 15:02
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 06.05.2009 
						Сообщений: 1,163
					 
		
 |  |  
	| 
	
 
	| Сообщение от Bbore   |  
	| Ведь я не переопределяю, а изменяю переменную...   |  
	
 Переменную изминить нельзя. Переменная всего лишь ссылкается на какой то тип данных. Причём вы даже не меняете тип данных - строку, а складываете две строки и в итоге результат операции - новая строка. 
Ну и собственно как написали выше    Строка почти буффер. А возможно и в реализациях движков это так и есть.
				__________________Нужно равняться на лучших, а не оправдываться за счёт худших.
 |  |  
	| 
		
	| 
			
			 
			
				18.11.2011, 15:51
			
			
			
		 |  
	| 
		
			|  | Модератор Всея Форума       |  | 
					Регистрация: 14.05.2009 
						Сообщений: 4,021
					 
		
 |  |  
	| 
	
 
	| Сообщение от nasqad |  
	| обьект String - readonly |  
	
 False:
 
var str = new String('value');
str.prop = 'prop value';
alert(str.prop);
				__________________ 
				Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф |  |  
	| 
		
	| 
			
			 
			
				18.11.2011, 17:52
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 06.05.2009 
						Сообщений: 1,163
					 
		
 |  |  
	| Таки реальное значение строки не поменять, наверно это имел введу человек. Хотя если брать примитив, то там естественно и обычное свойство невозможно присвоить. 
				__________________Нужно равняться на лучших, а не оправдываться за счёт худших.
 |  |  
	| 
		
	| 
			
			 
			
				18.11.2011, 19:37
			
			
			
		 |  
	| 
		
			|  | Модератор Всея Форума       |  | 
					Регистрация: 14.05.2009 
						Сообщений: 4,021
					 
		
 |  |  
	| Вот это правильное объяснение. Даже в объекте String нельзя. Но можно делать хитро: 
var str = new String('data'),
  data;
str.toString = function(){
  return data || ''.toString.call(this);
};
alert(str);
data = 'newData';
alert(str);
Т.е. можно использовать один объект, но значения он может возвращать разные.
				__________________ 
				Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф			 Последний раз редактировалось B~Vladi, 18.11.2011 в 19:40.
 |  |  
	| 
		
	| 
			
			 
			
				18.11.2011, 21:36
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 06.05.2009 
						Сообщений: 1,163
					 
		
 |  |  
	| Интересно, но вряд ли применимо. Скорее даже бессмысленно. Разве что в каком нибудь особом приложении нужна возможность выводить строки разных форматах/кодировках, или ещё что то с ними там проворачивать. Тогда можно реализовать через прототип, правда тоже сомнительно. 
				__________________Нужно равняться на лучших, а не оправдываться за счёт худших.
 |  |  
	| 
		
	| 
			
			 
			
				18.11.2011, 21:43
			
			
			
		 |  
	| 
		
			|  | Тлен       |  | 
					Регистрация: 02.01.2010 
						Сообщений: 6,601
					 
		
 |  |  
	| B~Vladi, В этом я вижу только способ жестоко вы*ть мозги прогеру-недругу в команде.)) 
				__________________ 29375, 35
 |  |  
	| 
		
	| 
			
			 
			
				18.11.2011, 21:49
			
			
			
		 |  
	| 
		
			|  | Модератор       |  | 
					Регистрация: 27.04.2010 
						Сообщений: 3,417
					 
		
 |  |  
	| B~Vladi, это как #define true false в С. Убей дебаггера)) |  |  
	| 
		
	| 
			
			 
			
				18.11.2011, 21:54
			
			
			
		 |  
	| 
		
			|  | Модератор Всея Форума       |  | 
					Регистрация: 14.05.2009 
						Сообщений: 4,021
					 
		
 |  |  
	| Aetae, если это документировано, или скрыто в нутрях твоего API, то никаких проблем не возникнет.
 
	
 
	| Сообщение от Nekromancer |  
	| Интересно, но вряд ли применимо. |  
	
 Не стоит придумывать нереальных задач. Нужно только помнить о том, что JS не строго-типизированный язык и когда объект преобразуется в текстовое значение - для этого вызывается нативный метод toString, который можно изменить. Если ты не поленишься и вникнешь в эти  исходники, то поймешь, что это достаточно юзабельный вариант. Мне он очень помог и решения лучше я не придумал. 
Если лень - могу объяснить. 
				__________________ 
				Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф			 Последний раз редактировалось B~Vladi, 18.11.2011 в 21:58.
 |  |  
	| 
		
	| 
			
			 
			
				18.11.2011, 21:57
			
			
			
		 |  
	| 
		
			|  | Модератор Всея Форума       |  | 
					Регистрация: 14.05.2009 
						Сообщений: 4,021
					 
		
 |  |  
	| 
	
 
	| Сообщение от trikadin |  
	| это как #define true false в С. Убей дебаггера)) |  
	
 Я не знаю СИ, но суть понятна. Вообще, про СИ говорят, что это опасный язык, так что там много чего можно наворотить  
				__________________ 
				Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф |  |  |  |