对象(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则提供了对对象的弱引用,适用于需要进行垃圾回收的场景。