Просмотр полной версии : Правда ли строки в JavaScript неизменяемы?
У Фленагана написано, что строки в JavaScript неизменяемые. Как-то никогда не заострял на этом внимания...
Но почему тогда работает код:
var s1 = "hello";
var s2 = "hell" + "o";
s2 = s2 + "o";
Ведь я не переопределяю, а изменяю переменную...:-?
Nekromancer
18.11.2011, 15:02
Ведь я не переопределяю, а изменяю переменную...:-?
Переменную изминить нельзя. Переменная всего лишь ссылкается на какой то тип данных. Причём вы даже не меняете тип данных - строку, а складываете две строки и в итоге результат операции - новая строка.
Ну и собственно как написали выше :) Строка почти буффер. А возможно и в реализациях движков это так и есть.
обьект String - readonly
False:
var str = new String('value');
str.prop = 'prop value';
alert(str.prop);
Nekromancer
18.11.2011, 17:52
Таки реальное значение строки не поменять, наверно это имел введу человек. Хотя если брать примитив, то там естественно и обычное свойство невозможно присвоить.
Вот это правильное объяснение. Даже в объекте 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
Интересно, но вряд ли применимо. Скорее даже бессмысленно. Разве что в каком нибудь особом приложении нужна возможность выводить строки разных форматах/кодировках, или ещё что то с ними там проворачивать. Тогда можно реализовать через прототип, правда тоже сомнительно.
B~Vladi, В этом я вижу только способ жестоко вы*ть мозги прогеру-недругу в команде.))
trikadin
18.11.2011, 21:49
B~Vladi, это как #define true false в С. Убей дебаггера))
Aetae, если это документировано, или скрыто в нутрях твоего API, то никаких проблем не возникнет.
Интересно, но вряд ли применимо.
Не стоит придумывать нереальных задач. Нужно только помнить о том, что JS не строго-типизированный язык и когда объект преобразуется в текстовое значение - для этого вызывается нативный метод toString, который можно изменить. Если ты не поленишься и вникнешь в эти (https://github.com/B-Vladi/TSN/) исходники, то поймешь, что это достаточно юзабельный вариант. Мне он очень помог и решения лучше я не придумал.
Если лень - могу объяснить.
это как #define true false в С. Убей дебаггера))
Я не знаю СИ, но суть понятна. Вообще, про СИ говорят, что это опасный язык, так что там много чего можно наворотить :)
trikadin
18.11.2011, 22:05
Это переопределение true как false))
Ну, всё зависит от кривизны рук программиста. Но вообще да, выстрелить себе в ногу (http://clck.ru/PQc2) там на ура можно (ссыль на луркморе).
Nekromancer
18.11.2011, 22:07
Если лень - могу объяснить.
Да нет, посмотрю.
Блин, только сейчас заметил, что запостил в "Работу"...:-E
Прошу у всех прощения, ошибся вкладками в браузере...
Благодарю за ответы! Теперь разобрался.
Это переопределение true как false))
Я же написал, что понял :)
Прошу у всех прощения, ошибся вкладками в браузере...
Перенёс.
trikadin
18.11.2011, 22:38
Я же написал, что понял
Ну мало ли) Понять можно и неправильно.
Nekromancer
18.11.2011, 22:46
B~Vladi,
Посмотрел. Не совсем разобрался ещё конечно, но в принципе понял, что имелось введу. Для объектов и я пользовался таким подходом, как раз когда делал но том же node.js - server push. Объект соединения при вызове строки возвращал md5 хеш.
Но использование такого подхода для строки, на мой взгляд, менее востребованно. Хотя тот пример, что я описывал не настолько не реальный:
(function(toString){
String.prototype.toString = function(encoding, currentEncoding){
if(!encoding) return toString;
else {
currentEncoding = this.encoding || 'utf8';
try{
return new Buffer(toString.call(this), currentEncoding).toString(this.encoding = encoding);
}catch(e){
return null; // Лучше ошибка вызвать конечно, но для примера так
}
}
};
}(String.prototype.toString));
Грубо говоря конечно. Так же в Strict Mode этот код упадёт :)
UPD: Таки currentEncoding можно опустить, Buffer сам по умолчанию выбирает uft8.
Посмотрел. Не совсем разобрался ещё конечно, но в принципе понял, что имелось введу.
Т.е. когда мы пытаемся получить значение атрибута, подставляются значения переменных, которые определены в исходном коде шаблона. Таким образом в реализациях логики тегов не приходится явно вычислять значения атрибутов.
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot