JavaScript 数据结构详解:对象、数组、Map、Set、WeakMap、WeakSet

88 阅读2分钟

对象(Object)

  • 定义: 无序的键值对的集合。(不严格有序,字符串key基本按插入顺序,数字按大小升序)
  • 键类型: 字符串或Symbol或者数字(数字会转为字符串)。
  • 顺序: 不保证属性的顺序。
  • 重复键: 不允许重复键,后面的值会覆盖前面的值。
javascriptCopy code
const person = {
  name: 'John',
  age: 30,
  city: 'New York'
};

数组(Array)

  • 定义: 有序的值的集合。
  • 键类型: 数字索引。
  • 顺序: 按照插入顺序存储元素。
  • 重复值: 允许重复值。
javascriptCopy code
const fruits = ['apple', 'orange', 'banana'];
console.log(fruits[0]);  // 输出: 'apple'

Map

  • 定义: 有序的键值对的集合。
  • 键类型: 任意数据类型,包括对象、函数、原始类型等 (当使用对象作为键时,即使该对象在其他地方没有引用,Map 仍会保留对键的引用,不会导致垃圾回收)
  • 顺序: 保持键值对的插入顺序。
  • 重复键: 允许重复键。
javascriptCopy code
const myMap = new Map();
myMap.set('key1', 'value1');
myMap.set('key2', 'value2');

console.log(myMap.get('key1'));  // 输出: 'value1'

Set

  • 定义: 无序且唯一值的集合。
  • 键类型: 任意数据类型。
  • 顺序: 不按照插入顺序存储元素。
  • 重复值: 不允许重复值。
javascriptCopy code
const mySet = new Set();
mySet.add('apple');
mySet.add('orange');
mySet.add('apple');  // 这个值将被忽略,因为它已经存在于集合中

console.log(mySet.size);  // 输出: 2

WeakMap

  • 定义: 有序的键值对的集合,键是弱引用。
  • 键类型: 只能是对象 (如果没有其他引用指向键对象,它将被自动回收,相应的键值对也会从 WeakMap 中删除)
  • 顺序: 无法保证键的顺序。
  • 重复键: 不允许重复键。
javascriptCopy code
let weakMap = new WeakMap();
let key = {};
weakMap.set(key, 'value');

console.log(weakMap.get(key));  // 输出: 'value'

WeakSet

  • 定义: 无序且唯一对象的集合,对象是弱引用。
  • 键类型: 只能是对象。
  • 顺序: 无法保证对象的顺序。
  • 重复值: 不允许重复对象。
javascriptCopy code
let weakSet = new WeakSet();
let obj = {};

weakSet.add(obj);
console.log(weakSet.has(obj));  // 输出: true

obj = null;  // 当对象被设置为null后,它会被垃圾回收
console.log(weakSet.has(obj));  // 输出: false

总体而言,对象用于简单的键值对存储,数组用于有序的值集合,而Map和Set提供了更复杂的数据结构,WeakMap和WeakSet则提供了对对象的弱引用,适用于需要进行垃圾回收的场景。