JavaScript中的弱参照和强参照以弱参照和强参照是什么为例示弱参照和强参照的例关于弱参照和强参照,在JavaScript中展示弱参照和强参照的特性总结
弱引用和强引用是什么
JavaScript中的强引用:对对象的引用在JavaScript中是强引用。 也就是说,如果用变量或常数保存引用对象,则该变量或常数是强引用,不会回收该对象。
JavaScript中的弱引用: WeakMaps和WeakSets是JavaScript中使用弱引用的唯一方法。 将对象作为键添加到WeakMap或WeakSet并不能阻止这些对象的重用。
例如,弱引用和强引用的有力引用表明,孩子a带着狗,他们之间用狗链连接着。
虽然是微弱的引用,但是旁边有人b指着A连接的狗说:“喂,那是一只狗,B指的是那只狗,但他们之间没有联系的东西。
如果a放开狗链,不管b是否还指着,狗都会逃跑。
但是,当b不再指向那只狗时,狗还被a牵着,不影响它是否逃跑。
在JavaScript中弱引用和强引用let people={name:温柔鞋垫,age:25}let people1=people; 在上面的代码中,如果将{name:温柔的鞋垫,age:25}分配给变量people,内存中就会存在一条线,将它们连接在一起。
然后,创建people1变量并将people代入people1。 这相当于people1也引用了这个对象。
让我们看看使用ES6中新引入的WeakSet和WeakMap类型保存引用值时会发生什么情况。
let people={name:温柔鞋垫,age:25}let people1=people; let set=new WeakSet (; set.add(People; 我们创建了一个新的WeakSet ()实例。 add方法将添加人员。 people对应的参考值为{name:慈爱的鞋垫,age:25}。
可以看到,set实例的值{ name :’温柔鞋垫,age:25}参考了{ name :’温柔鞋垫,age336025}。 (在实际内存中,他指向此数据的堆栈的指针引用,该堆栈指向相应堆中相应地址的值。 而且需要特别注意的是,这个弱引用的“线”是透明的。 这是什么意思? 和他强烈引用的区别在哪里?
一言以蔽之,强引用被认为是{name:温柔鞋垫,age:25}的引用被认为是一个“连接”,而弱引用不被认为是。 换句话说,不知道该引用被set实例引用。
这表示不知道垃圾收集被set实例引用了。 如果引用的所有强引用连接都已断开(如果为变量指定了null等值),即使set实例仍在引用,也会将其作为垃圾丢弃。
let people={name:温柔鞋垫,age:25}let people1=people; let set=new WeakSet (; set.add(People; people=null; people1=空; 如果我们切断所有强烈的引用会怎么样呢?
因为所有的强引用都断了,垃圾回收认为不需要应该引用的{name: '温柔的鞋垫,age:25},所以废弃他。 即使set实例仍在使用引用,相应set实例中使用的引用也将不再存在。
弱参照的特性总结1、WeakSet中对象的参照是弱参照。 也就是说,即使WeakSet“引用”了某个对象,垃圾回收也不会将该引用计为“引用”,而是只保存该对象无法到达且随时可能回收的引用类型,除非在其他位置有强引用
2、WeakMap和Map相似,但不能枚举,不能为空,对于key引用的对象是弱引用。
3、WeakSet适合临时存储一组对象,也适合存储与对象关联的信息。 如果这些对象在外部消失,WeakSet中的引用将自动消失。 由于以上特征,WeakSet成员随时都会消失,因此不适合引用。
4、强引用可能会导致忘记取消引用而无法释放内存,从而导致内存泄漏。 弱引用不计入垃圾回收机制,所以没有这个问题。