Правда ли строки в JavaScript неизменяемы?
У Фленагана написано, что строки в JavaScript неизменяемые. Как-то никогда не заострял на этом внимания...
Но почему тогда работает код: var s1 = "hello"; var s2 = "hell" + "o"; s2 = s2 + "o"; Ведь я не переопределяю, а изменяю переменную...:-? |
Цитата:
Ну и собственно как написали выше :) Строка почти буффер. А возможно и в реализациях движков это так и есть. |
Цитата:
var str = new String('value'); str.prop = 'prop value'; alert(str.prop); |
Таки реальное значение строки не поменять, наверно это имел введу человек. Хотя если брать примитив, то там естественно и обычное свойство невозможно присвоить.
|
Вот это правильное объяснение. Даже в объекте String нельзя. Но можно делать хитро:
var str = new String('data'), data; str.toString = function(){ return data || ''.toString.call(this); }; alert(str); data = 'newData'; alert(str); Т.е. можно использовать один объект, но значения он может возвращать разные. |
Интересно, но вряд ли применимо. Скорее даже бессмысленно. Разве что в каком нибудь особом приложении нужна возможность выводить строки разных форматах/кодировках, или ещё что то с ними там проворачивать. Тогда можно реализовать через прототип, правда тоже сомнительно.
|
B~Vladi, В этом я вижу только способ жестоко вы*ть мозги прогеру-недругу в команде.))
|
B~Vladi, это как #define true false в С. Убей дебаггера))
|
Aetae, если это документировано, или скрыто в нутрях твоего API, то никаких проблем не возникнет.
Цитата:
Если лень - могу объяснить. |
Цитата:
|
Это переопределение true как false))
Ну, всё зависит от кривизны рук программиста. Но вообще да, выстрелить себе в ногу там на ура можно (ссыль на луркморе). |
Цитата:
|
Блин, только сейчас заметил, что запостил в "Работу"...:-E
Прошу у всех прощения, ошибся вкладками в браузере... Благодарю за ответы! Теперь разобрался. |
Цитата:
Цитата:
|
Цитата:
|
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. |
Цитата:
|
Часовой пояс GMT +3, время: 09:14. |