Я не уверен в JavaScript, но в Java строки добавляют дополнительный шаг к неизменяемости, используя «String Constant Pool». Строки могут быть построены со строковыми литералами ("foo"
) или с помощью конструктора класса String
. Строки, построенные со строковыми литералами, являются частью пула константных строк, и тот же строковый литерал всегда будет одним и тем же адресом памяти из пула.
Пример:
String lit1 = "foo";
String lit2 = "foo";
String cons = new String("foo");
System.out.println(lit1 == lit2); // true
System.out.println(lit1 == cons); // false
System.out.println(lit1.equals(cons)); // true
В приведенном выше описании, как lit1
и lit2
построены с использованием той же строки буквальным, так что они указывают на тот же адрес памяти; lit1 == lit2
приводит к true
, потому что это точно такой же объект.
Однако cons
построен с использованием конструктора классов. Хотя параметр является одной и той же строковой константой, конструктор выделяет новую память для cons
, то есть cons
- это не тот же объект, что и lit1
, и lit2
, несмотря на то, что они содержат одни и те же данные.
Конечно, поскольку все три строки содержат одни и те же символьные данные, метод equals
вернет true.
(Оба типа струнной конструкции неизменны, конечно)
Эта же строка, если она изменена и назначена, обновит строку var str = 'foo'; str = str.substr (1)); // oo alert (str); // oo –
Как насчет ниже кода. Строковое значение теперь изменяется. var name = "Santosh"; console.log (name.substr (0,2)); var name = "kumar" console.log (имя); Как его все еще неизменен – Santosh