В этой статье я попытаюсь объяснить, как javascript работает со строками в памяти.
Итак, прежде всего, строки — это примитивный тип данных, который хранится в специальном месте в памяти, называемом пул строковых констант.
Пул строковых констант — это небольшой кэш, который находится в куче.
давайте сначала проверим нормальное назначение строки следующим образом:
let str1 = "Hello"; let str2 = "Hello"; let str3 = "World"; console.log(str1 == str2); // true console.log(str1 == str3); // false
Приведенный выше код представлен в памяти следующим образом:
Мы видим, что str1 и str2 указывают на одно и то же место в памяти, в то время как для str3 создается новое пространство, поскольку оно имеет другое значение. Таким образом, пул строковых констант экономит память, заставляя одну и ту же строку значений указывать на одно и то же место в памяти.
Теперь у нас есть 2 способа создать строку следующим образом:
let userName= "Mohamed"; let userName2 = new String("Mohamed");
Разница между ними в основном отражается в распределении памяти.
Мы знаем, что в JavaScript все объекты являются ссылочными типами и размещаются в куче памяти.
В то же время для эффективной обработки строк механизм V8 поддерживает пул строковых констант. Строки хранятся в пуле строковых констант.
Таким образом, диаграмма распределения памяти приведенного выше кода во время выполнения выглядит следующим образом:
userName
ссылаются на строку в пуле строковых констант напрямую, а userName2
ссылаются на объект в куче, созданный с использованием ключевого слова new
.
Другой пример:
let userName = new String("Mohamed"); let userName1 = new String("Mohamed"); let userName2 = new String("Nour"); console.log(userName == userName1); //false console.log(userName == userName2); //false
На изображении видно, что хотя userName
и userName1
имеют одинаковое значение, но из-за нового ключевого слова они ссылаются на разные места в памяти. Следовательно, они возвращают false при сравнении.
Вывод:
При создании строк с использованием кавычек (" ") они сохраняются непосредственно в пуле строковых констант, где одинаковые значения относятся к одному и тому же месту в памяти. Принимая во внимание, что когда строки создаются с использованием нового ключевого слова, новый экземпляр всегда создается в памяти кучи, а затем значение сохраняется в пуле строковых констант из-за этого, даже если сохраненные данные одинаковы, строки не будут равны.