一、数组(Array)
1. 定义与特点
数组是 JavaScript 中一种有序的数据集合,用于存储多个值。它使用数字索引(从 0 开始)来访问和操作元素。数组的长度可以动态变化,并且可以存储任意类型的数据,包括基本数据类型(如数字、字符串、布尔值)和引用数据类型(如对象、数组)。
2. 作用
- 存储有序数据:适用于需要按特定顺序存储和访问数据的场景,例如存储一系列日期、学生成绩等。
- 方便遍历和操作:可以使用多种循环结构(如
for循环、for...of循环)和数组方法(如map、filter、reduce)对数组元素进行批量处理。
3. 示例代码
// 创建一个包含不同类型元素的数组
const mixedArray = [10, "hello", true, { name: "John" }, [1, 2, 3]];
// 通过索引访问数组元素
console.log(mixedArray[1]); // 输出: hello
// 使用 for 循环遍历数组
for (let i = 0; i < mixedArray.length; i++) {
console.log(mixedArray[i]);
}
// 使用 for...of 循环遍历数组
for (const element of mixedArray) {
console.log(element);
}
// 使用 map 方法对数组元素进行处理
const squaredNumbers = [1, 2, 3, 4].map(num => num * num);
console.log(squaredNumbers); // 输出: [1, 4, 9, 16]
二、对象(Object)
1. 定义与特点
对象是 JavaScript 中一种无序的数据集合,由键值对组成。键通常是字符串(在 ES6 之前必须是字符串,ES6 引入了符号作为键),值可以是任意类型的数据。对象通过键来访问和操作其属性。
2. 作用
- 存储和组织相关数据:适用于表示具有多个属性的实体,例如用户信息、配置选项等。
- 封装数据和行为:可以将相关的数据和方法封装在一个对象中,实现面向对象编程的思想。
3. 示例代码
// 创建一个表示用户信息的对象
const user = {
name: "Alice",
age: 25,
isAdmin: true,
address: {
street: "123 Main St",
city: "New York",
state: "NY"
}
};
// 通过键访问对象属性
console.log(user.name); // 输出: Alice
console.log(user.address.city); // 输出: New York
// 使用 for...in 循环遍历对象属性
for (const key in user) {
console.log(`${key}: ${user[key]}`);
}
// 为对象添加新属性
user.email = "alice@example.com";
console.log(user.email); // 输出: alice@example.com
// 定义对象方法
const calculator = {
add: function(a, b) {
return a + b;
},
subtract: function(a, b) {
return a - b;
}
};
console.log(calculator.add(5, 3)); // 输出: 8
三、Map
1. 定义与特点
Map 是 ES6 引入的一种新的数据结构,用于存储键值对。与对象不同的是,Map 的键可以是任意类型的数据,包括对象、函数等,并且会保持插入顺序。Map 提供了专门的方法来操作键值对,如 set、get、has、delete 等。
2. 作用
- 灵活的键类型:适用于需要使用非字符串类型的键来存储数据的场景,例如使用对象作为键来缓存计算结果。
- 可迭代性:可以使用
for...of循环或forEach方法直接遍历 Map 中的键值对。
3. 示例代码
// 创建一个 Map 对象
const myMap = new Map();
// 使用对象作为键
const keyObj = { id: 1 };
myMap.set(keyObj, "Value associated with keyObj");
// 使用函数作为键
const keyFunc = function() {};
myMap.set(keyFunc, "Value associated with keyFunc");
// 获取 Map 中的值
console.log(myMap.get(keyObj)); // 输出: Value associated with keyObj
// 检查 Map 中是否存在某个键
console.log(myMap.has(keyFunc)); // 输出: true
// 使用 for...of 循环遍历 Map
for (const [key, value] of myMap) {
console.log(`${key}: ${value}`);
}
// 使用 forEach 方法遍历 Map
myMap.forEach((value, key) => {
console.log(`${key}: ${value}`);
});
// 删除 Map 中的键值对
myMap.delete(keyObj);
console.log(myMap.has(keyObj)); // 输出: false
四、选择建议
- 数组:当需要存储有序的数据集合,并且主要通过索引来访问和操作元素时,选择数组。例如,处理列表、队列、栈等数据结构。
- 对象:当需要存储和组织相关的数据,并且通过字符串键来访问属性时,选择对象。例如,存储配置信息、表示实体的属性等。
- Map:当需要使用非字符串类型的键,或者需要保持插入顺序,并且频繁进行添加、删除键值对的操作时,选择 Map。例如,实现缓存机制、存储复杂的数据映射关系等。