all-threads-bot

Frontender`s Spectre

JavaScript | Практика #165 | WeakMap | ★★★☆☆

31 марта 2023 г., 10:56

<p><b>Ответ: <code>TypeError</code></b></p> <p>Вопрос, конечно, с подвохом, но не спешите оценить его, как легкий. Те, кто понимают работы <code>WeakMap</code> сразу бы "купились" на "уничтожение" ссылки на объект. Забегая наперед, надо отметить, что <strong>сборка мусора запускается не сразу</strong>.</p> <p><code>WeakMap</code> является типом коллекции в JavaScript, который представляет собой таблицу ассоциативных связей, где ключами могут быть только объекты. <code>WeakMap</code> обладает следующими особенностями:</p> <ol> <li> <p>Объекты, используемые в качестве ключей, не участвуют в подсчете ссылок, поэтому они могут быть автоматически удалены из <code>WeakMap</code> сборщиком мусора, если на них нет других ссылок.</p> </li> <li> <p><code>WeakMap</code> не имеет свойства <code>size</code> и методов <code>clear()</code>, <code>keys()</code>, <code>values()</code> и <code>entries()</code>, которые присутствуют у Map.</p> </li> <li> <p><code>WeakMap</code> не может использоваться для итерации, поскольку не гарантирует порядок элементов.</p> </li> <li> <p><code>WeakMap</code> может использоваться для создания приватных переменных в классе, так как ключи <code>WeakMap</code> могут быть доступны только из экземпляра, а не из внешнего кода.</p> </li> <li> <p><code>WeakMap</code> может использоваться для хранения дополнительных данных, связанных с объектом, которые должны быть удалены, когда объект удаляется из памяти.</p> </li> </ol> <p>В данном коде создается новый экземпляр <code>WeakMap</code>, который позволяет хранить ассоциативные связи между объектами.</p> <p>Затем создается новый объект <code>{}</code>, который не имеет связей с другими объектами. Этот объект добавляется в <code>WeakMap</code> в качестве ключа и связывается со значением <code>'value'</code>.</p> <p>Далее вызывается метод <code>get()</code> у <code>WeakMap</code>, передавая в качестве аргумента объект <code>{}</code>. Так как этот объект является тем же самым объектом, что был добавлен в <code>WeakMap</code>, метод <code>get()</code> возвращает строку <code>'value'</code>.</p> <p>Однако, после этого строки <code>obj = null</code> пытается присвоить <code>null</code> константе <code>obj</code>, которая уже не может быть изменена, так как объявлена с использованием ключевого слова <code>const</code>. Это приводит к ошибке выполнения (TypeError), так как нельзя изменять значения, присвоенные константам в JavaScript.</p>

<p><b>Ответ: <code>TypeError</code></b></p> <p>Вопрос, конечно, с подвохом, но не спешите оценить его, как легкий. Те, кто понимают работы <code>WeakMap</code> сразу бы "купились" на "уничтожение" ссылки на объект. Забегая наперед, надо отметить, что <strong>сборка мусора запускается не сразу</strong>.</p> <p><code>WeakMap</code> является типом коллекции в JavaScript, который представляет собой таблицу ассоциативных связей, где ключами могут быть только объекты. <code>WeakMap</code> обладает следующими особенностями:</p> <ol> <li> <p>Объекты, используемые в качестве ключей, не участвуют в подсчете ссылок, поэтому они могут быть автоматически удалены из <code>WeakMap</code> сборщиком мусора, если на них нет других ссылок.</p> </li> <li> <p><code>WeakMap</code> не имеет свойства <code>size</code> и методов <code>clear()</code>, <code>keys()</code>, <code>values()</code> и <code>entries()</code>, которые присутствуют у Map.</p> </li> <li> <p><code>WeakMap</code> не может использоваться для итерации, поскольку не гарантирует порядок элементов.</p> </li> <li> <p><code>WeakMap</code> может использоваться для создания приватных переменных в классе, так как ключи <code>WeakMap</code> могут быть доступны только из экземпляра, а не из внешнего кода.</p> </li> <li> <p><code>WeakMap</code> может использоваться для хранения дополнительных данных, связанных с объектом, которые должны быть удалены, когда объект удаляется из памяти.</p> </li> </ol> <p>В данном коде создается новый экземпляр <code>WeakMap</code>, который позволяет хранить ассоциативные связи между объектами.</p> <p>Затем создается новый объект <code>{}</code>, который не имеет связей с другими объектами. Этот объект добавляется в <code>WeakMap</code> в качестве ключа и связывается со значением <code>'value'</code>.</p> <p>Далее вызывается метод <code>get()</code> у <code>WeakMap</code>, передавая в качестве аргумента объект <code>{}</code>. Так как этот объект является тем же самым объектом, что был добавлен в <code>WeakMap</code>, метод <code>get()</code> возвращает строку <code>'value'</code>.</p> <p>Однако, после этого строки <code>obj = null</code> пытается присвоить <code>null</code> константе <code>obj</code>, которая уже не может быть изменена, так как объявлена с использованием ключевого слова <code>const</code>. Это приводит к ошибке выполнения (TypeError), так как нельзя изменять значения, присвоенные константам в JavaScript.</p>
Ниже представлено пояснение.

Ответ: TypeError

Вопрос, конечно, с подвохом, но не спешите оценить его, как легкий. Те, кто понимают работы WeakMap сразу бы "купились" на "уничтожение" ссылки на объект. Забегая наперед, надо отметить, что сборка мусора запускается не сразу.

WeakMap является типом коллекции в JavaScript, который представляет собой таблицу ассоциативных связей, где ключами могут быть только объекты. WeakMap обладает следующими особенностями:

  1. Объекты, используемые в качестве ключей, не участвуют в подсчете ссылок, поэтому они могут быть автоматически удалены из WeakMap сборщиком мусора, если на них нет других ссылок.

  2. WeakMap не имеет свойства size и методов clear(), keys(), values() и entries(), которые присутствуют у Map.

  3. WeakMap не может использоваться для итерации, поскольку не гарантирует порядок элементов.

  4. WeakMap может использоваться для создания приватных переменных в классе, так как ключи WeakMap могут быть доступны только из экземпляра, а не из внешнего кода.

  5. WeakMap может использоваться для хранения дополнительных данных, связанных с объектом, которые должны быть удалены, когда объект удаляется из памяти.

В данном коде создается новый экземпляр WeakMap, который позволяет хранить ассоциативные связи между объектами.

Затем создается новый объект {}, который не имеет связей с другими объектами. Этот объект добавляется в WeakMap в качестве ключа и связывается со значением 'value'.

Далее вызывается метод get() у WeakMap, передавая в качестве аргумента объект {}. Так как этот объект является тем же самым объектом, что был добавлен в WeakMap, метод get() возвращает строку 'value'.

Однако, после этого строки obj = null пытается присвоить null константе obj, которая уже не может быть изменена, так как объявлена с использованием ключевого слова const. Это приводит к ошибке выполнения (TypeError), так как нельзя изменять значения, присвоенные константам в JavaScript.