? Сильные ссылки в JavaScript. Ссылка на объект является сильной ссылкой в JavaScript, то есть, когда将一个引用对象通过变量或常量保存
, тогда переменная или константа является сильной ссылкой. и объект не будет Recycle.
Слабые ссылки в JavaScript. WeakMaps и WeakSets — единственные способы использования слабых ссылок в JavaScript.将一个对象作为键添加
в WeakMap или WeakSet не предотвращает повторное использование этих объектов.
. Сильная ссылка — ребенок А держит собаку, и они связаны собачьей цепью.
Слабая ссылка состоит в том, что человек Б указывает на собаку, которую держит А, и говорит: «Эй, там есть собака», а Б указывает на собаку, но между ними нет ничего связанного.
Когда А отпускает поводок, собака убежит (была собрана мусор), независимо от того, указывает ли Б по-прежнему.
Однако, когда B больше не указывает на собаку, собака все еще удерживается A, что не повлияет на то, убежит ли она.
пусть люди = {name:'Zhang San',age:25} let люди1 = люди;
В приведенном выше коде, когда мы присваиваем {name:'张三',age:25}
переменной люди, в памяти появится линия, соединяющая их:
Затем создайте переменную People1 и назначьте людей переменной People1, что эквивалентно тому, что люди1 также ссылаются на этот объект:
Давайте посмотрим, что происходит, когда мы используем новые типы WeakSet и WeakMap в ES6 для хранения ссылочных значений.
пусть люди = {имя: 'Чжан Сан', возраст: 25} пусть люди1 = люди; пусть set = новый WeakSet(); set.add(people);
Мы создали новый экземпляр WeakSet() и добавили людей с помощью метода add. Ссылочное значение, соответствующее людям, — {name:'张三',age:25}
.
Видно, что значение {name:'张三',age:25}
в экземпляре set относится к {name:'张三',age:25}
(в реальной памяти оно указывает на стек данных Ссылка на указатель, стек указывает на значение соответствующего адреса в соответствующей куче). И важно отметить, что эта «линия» слабых ссылок прозрачна. Что это значит? В чем разница между ним и сильной кавычкой?
Краткое содержание одним предложением: сильная ссылка распознается как «связь» по ссылке {name:'张三',age:25}
, а слабая ссылка не распознается. То есть ссылка не знает, что на нее ссылается заданный экземпляр.
Это означает, что сборщик мусора не знает, что на ссылку ссылается экземпляр набора. Тогда, если все сильные ссылочные связи ссылки отключены (переменной присвоено значение null или другие обстоятельства), то ссылка будет уничтожена как мусор, даже если экземпляр набора все еще ссылается на ссылку.
пусть люди = {имя: 'Чжан Сан', возраст: 25} пусть люди1 = люди; пусть set = новый WeakSet(); set.add(люди); люди = ноль; люди1 = null;
Что произойдет, если мы отключим все сильные ссылки?
Поскольку все сильные ссылки отключены, сборщик мусора считает, что ссылка {name:'张三',age:25}
больше не нужна, и уничтожит ее. Тогда ссылка, используемая соответствующим экземпляром набора, больше не существует, даже если экземпляр набора все еще использует ссылку.
1. Ссылка на объект в WeakSet является слабой ссылкой. То есть, даже если слабый набор «ссылается» на объект, сборщик мусора не считает эту ссылку «ссылкой», поскольку пока нет сильных ссылок где-либо еще, этот объект недоступен и может быть переработан в любое время, он может хранить только ссылочные типы и не может быть перечислен или очищен;
2. WeakMap аналогичен Map, но он не является перечисляемым, не может быть очищен, а объект, на который ссылается ключ, является слабой ссылкой.
3. WeakSet подходит для временного хранения группы объектов и хранения информации, привязанной к объектам. Пока эти объекты исчезают извне, ссылки на них в WeakSet автоматически исчезнут. Из-за вышеперечисленных характеристик члены WeakSet не подходят для ссылки, поскольку они исчезнут в любой момент.
4. В сильных ссылках иногда забывают разыменовать, что приводит к невозможности освобождения памяти, что может привести к утечкам памяти. Слабые ссылки не включены в механизм сборки мусора, поэтому этой проблемы не существует.