ES6
ES6特性:
- 变量声明const/let
- 模板字符串
- 箭头函数
- ESM模块
- promise
- proxy
- set/map
箭头函数和普通函数的区别
箭头函数:
- 箭头函数会捕获其所在上下文的this 值,作为自己的this 值,自己本身并没有this值
- 不可以当作构造函数,也就是说,不可以使用
new命令,否则会抛出一个错误 - 不可以使用
arguments对象,该对象在函数体内不存在。如果要用,可以用Rest参数代替
WeakSet 和 WeakMap理解
WeakSet 和 WeakMap: 目的是为了解决内存泄漏问题和减少内存占用。
WeakSet 和 WeakMap 有什么区别?
WeakSet/WeakMap区别?
- WeakSet和WeakMap的区别在于它们所存储的数据类型不同
- WeakSet 的成员只能是对象,而不能是其他类型的值 【WeakSet 只有健值,没有健名,有点类似数组。】
- WeakMap只接受对象作为键名,值可以任意类型 【WeapMap的键名所指向的对象,不计入垃圾回收机制 ,WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。】
WeakSet/WeakMap是否支持遍历?
- WeakSet/WeakMap没有遍历操作 【既没有keys()、values()、entries方法、size属性】
- 不能遍历 是因为成员都是弱引用,随时可能消失,遍历机制无法保证成员的存在,很可能刚刚遍历结束,成员就取不到了
为什么WeakSet 和 WeakMap 可以避免内存泄漏?
- 对象通常是通过引用来传递和存储的。当一个对象不再被其他对象引用时,它将被垃圾回收。但是,如果一个对象仍然存在于集合中,它就会被认为是仍然被引用的,因此不会被垃圾回收,这可能导致内存泄漏。
使用WeakSet和WeakMap存储对象时,集合中的每个对象都只是一个弱引用,也就是说,只要该对象不再被其他对象引用,它就会被垃圾回收。这意味着,如果对象从程序中删除,那么它们存储在WeakSet和WeakMap中的弱引用也会自动被删除,从而避免了内存泄漏
当我们创建一个对象并将其存储在变量中时,该变量会持有对该对象的引用。只要有一个引用存在,垃圾回收器就不会回收它,因为该对象始终被认为是可访问的。这可能导致内存泄漏,因为对象无法被垃圾回收器清理,即使它们不再被使用。
然而,WeakSet和WeakMap的工作原理和普通对象有所不同。它们对于存储对象的引用并不会增加这些对象被回收的引用计数
WeakMap场景
- WeakMap 的主要应用场景是在需要存储一些临时数据或私有数据,并且不希望影响垃圾回收的情况下使用。
- 实际开发中,WeakMap 经常用于实现私有属性和缓存等场景
- 对象在其他地方没有被引用时,垃圾回收器会自动清理缓存中的数据,这样可以避免缓存数据占用过多内存
私有化属性
ES6 引入了 WeakMap 和 Symbol,为实现私有属性提供了更加灵活和安全的方式。但它们各自适用于不同的场景和需求
- WeakMap 提供了更好的隐藏性和避免内存泄露
- Symbol 提供了属性唯一性和明确性
WeakMap和Symbol的区别
- WeakMap 适用于实现对象的私有属性。通过使用 WeakMap,可以将私有属性存储在与对象无关的地方,从而隐藏实现细节,并且在对象不再被引用时,对应的私有属性会被自动清除,避免内存泄漏。
- Symbol 是一种基本数据类型,在 JavaScript 中用于创建唯一且不可变的标识符。每个通过 Symbol() 创建的 Symbol 都是唯一的
- Symbol 可以用于实现对象的私有属性。通过将 Symbol 作为对象的属性名,可以防止外部直接访问私有属性,因为只有拥有对应的 Symbol,才能访问或修改对应的属性值。
- Symbol 是唯一的,通过 Symbol 来作为私有属性,可以避免属性名冲突的问题