Я не впевнений у JavaScript, але в Java, рядки роблять додатковий крок до незмінності за допомогою "String Constant Pool". Рядки можуть бути побудовані за допомогою рядкових літералів ( "foo") або з Stringконструктором класу. Рядки, побудовані за допомогою рядкових літералів, є частиною String Constant Pool, і той самий рядковий літерал завжди буде однаковою адресою пам'яті з пулу.
Приклад:
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.
(Звичайно, обидва типи струнних конструкцій незмінні)