Строка JavaScript как массив: читать, но не писать - PullRequest
1 голос
/ 03 августа 2011

Для JavaScript в большинстве браузеров * вы можете читать символ из строки, рассматривая его как массив. Однако во всех браузерах, которые я пробовал (IE9, Chrome, Firefox), вы не можете писать в него как массив.

Например :

var string = 'hello world';
alert(string[0]);//alerts 'h'
alert(string);//alerts 'hello world'

string[0]='j';
alert(string[0]);//alerts 'h'
alert(string);//alerts 'hello world'

Это имеет последствия не только для разработчиков JavaScript:

jelloPeople.roam();


Кто-нибудь знает причину этого?


Например, я посмотрел документацию Mozilla , и они ссылаются на это, но не дают объяснения:

".. попытка установить символ с помощью индексации не выдает ошибку, но сама строка не изменяется."

Итог: мне странно и странно, что некоторые свойства массива были переданы Strings, а не другим.

UPDATE:

Хорошо, поэтому строки JavaScript являются неизменяемыми объектами, но почему? Похоже, что операции, подобные приведенным выше, были бы быстрее, если бы они не были неизменяемыми (измените 1 символ вместо создания новой строки из 11 символов). На самом деле, я не вижу случая с функциями String, где производительность была бы отрицательно сказана, если бы они не были неизменными, но я вижу несколько случаев, когда производительность будет улучшена. Кроме того, в JavaScript нет настоящей многопоточности, поэтому нет никаких преимуществ для неизменяемых.

(удалено и будет исследовать это и, возможно, задать новый вопрос)


* Не IE 6 или 7

Ответы [ 2 ]

4 голосов
/ 03 августа 2011

Я думаю, это может быть потому, что строки в JavaScript неизменны.Обратите внимание, что каждая строковая функция на самом деле не меняет саму строку, а возвращает новую.Это то же самое для непосредственного изменения символов, оно не будет работать с неизменяемой моделью.

4 голосов
/ 03 августа 2011

Это просто потому, что строки javascript неизменны по своему замыслу;после создания они не могут быть изменены.

...