返回

借助Map/WeakMap、Set/WeakSet,在ES6中闪电般理解键值存储

前端

键/值的存储方式

在ES6之前,使用object对象是完成键/值存储的便捷且高效的方法。然而,ES6标准新增了map和set这两个数据结构,为键/值存储提供了更加强大的选择。

Map

Map是一种键/值存储结构,与对象相似,但具有更强的功能。它可以接受任意类型的值作为键,包括对象和函数。此外,Map会记住键的插入顺序,这在某些情况下非常有用。

Map的优势:

  • 可以接受任意类型的值作为键。
  • 键的顺序会被记住。
  • 提供了许多有用的方法,例如get()、set()、delete()、clear()等。

Map的示例:

const myMap = new Map();

myMap.set('name', 'John Doe');
myMap.set(1, 'One');
myMap.set(true, 'True');

console.log(myMap.get('name')); // 'John Doe'
console.log(myMap.get(1)); // 'One'
console.log(myMap.get(true)); // 'True'

WeakMap

WeakMap与Map类似,但它具有更弱的引用。这意味着WeakMap中的键不会阻止垃圾回收器回收它们所引用的对象。这对于存储临时数据或防止内存泄漏非常有用。

WeakMap的优势:

  • 键不会阻止垃圾回收器回收它们所引用的对象。
  • 提供了许多有用的方法,例如get()、set()、delete()、clear()等。

WeakMap的示例:

const myWeakMap = new WeakMap();

const obj = {};

myWeakMap.set(obj, 'Hello World!');

console.log(myWeakMap.get(obj)); // 'Hello World!'

Set

Set是一种不存储重复值的集合。与数组不同,Set中的元素是无序的。这使得Set非常适合用于存储唯一值或检查某个值是否存在于集合中。

Set的优势:

  • 不存储重复值。
  • 元素是无序的。
  • 提供了许多有用的方法,例如add()、delete()、clear()、has()等。

Set的示例:

const mySet = new Set();

mySet.add('One');
mySet.add('Two');
mySet.add('Three');

console.log(mySet.has('One')); // true
console.log(mySet.has('Four')); // false

WeakSet

WeakSet与Set类似,但它具有更弱的引用。这意味着WeakSet中的值不会阻止垃圾回收器回收它们所引用的对象。这对于存储临时数据或防止内存泄漏非常有用。

WeakSet的优势:

  • 值不会阻止垃圾回收器回收它们所引用的对象。
  • 提供了许多有用的方法,例如add()、delete()、clear()、has()等。

WeakSet的示例:

const myWeakSet = new WeakSet();

const obj = {};

myWeakSet.add(obj);

console.log(myWeakSet.has(obj)); // true

总结

ES6中的Map和WeakMap、Set和WeakSet提供了比传统对象和数组更强大的键/值存储功能。Map和WeakMap可以存储任意类型的值作为键,Set和WeakSet可以存储唯一值。这些数据结构非常适合用于提高代码性能和防止内存泄漏。