JavaScript 数组详解:创建与遍历的艺术

51 阅读3分钟

JavaScript 数组详解:创建与遍历的艺术

在 JavaScript 中,数组是一种基础且强大的线性数据结构,以其连续存储的特性和 “开箱即用” 的便捷性,成为开发者日常工作中不可或缺的工具。本文将结合具体代码示例,详细解析数组的创建方式与遍历方法,帮助你更好地理解和运用这一核心数据结构。

一、数组的本质与特性

数组属于线性数据结构,其元素在内存中占据连续的存储空间,这使得通过索引访问元素的时间复杂度达到 O (1),效率极高。与链表等离散存储结构相比,在数据量较少时,数组的性能更优;但 JS 数组支持动态扩容 —— 当现有空间不足时,会自动 “搬家” 到更大的内存空间,这虽然带来了灵活性,却也可能在频繁扩容时产生性能开销。

二、数组的创建方式

创建数组的方式多样,需根据实际需求选择:

  1. 字面量创建(已知元素)当明确知道数组元素时,直接使用字面量形式最为简洁:
const arr = [1, 2, 3, 4, 5, 6]; // 直接定义包含具体元素的数组
  1. 构造函数创建(未知元素)若仅知道数组长度但不确定元素值,可结合new Array()fill()初始化:
// 创建长度为6的空数组
const arr2 = new Array(6); // 结果:[empty × 6]

// 创建长度为6且所有元素为0的数组
const arr = (new Array(6)).fill(0); // 结果:[0, 0, 0, 0, 0, 0]

fill()方法能快速填充初始值,避免内存空间的浪费或不足。

三、数组的遍历方法

遍历是数组操作的核心,不同场景下需选择合适的方法,以下是常见方式及特点:

  1. 传统计数循环(性能最优)这种循环与 CPU 工作机制高度契合,通过缓存数组长度(len = arr.length)减少属性访问开销,性能最佳:
const arr = (new Array(6)).fill(0);
const len = arr.length; // 缓存长度,减少性能损耗
for (let i = 0; i < len; i++) {
  console.log(arr[i]); // 按索引访问元素
}
  1. for...of 循环(可读性优先)ES6 新增的for...of专注于遍历元素本身,语法简洁,可读性强,适合大多数简单遍历场景:
const arr = [1, 2, 3, 4, 5, 6];
for (let item of arr) {
  console.log(item); // 直接获取元素值
}
  1. forEach 方法(功能有限的遍历)作为数组内置方法,forEach接收回调函数遍历元素,但存在局限性:无法通过break中断循环,且因函数入栈出栈操作,性能略逊于传统循环:
const arr = [1, 2, 3, 4, 5, 6];
arr.forEach((item, index) => {
  console.log(item, index); // 同时获取元素与索引
  // 此处无法使用break中断遍历
});
  1. for...in 循环(不推荐用于数组)for...in设计用于遍历对象属性,若用于数组,会将索引作为 “键” 返回,且可能遍历到原型链上的额外属性,因此不建议用于数组遍历:
const arr = [1, 2, 3, 4, 5, 6];
for (let key in arr) {
  console.log(key, arr[key]); // key为字符串类型的索引(如"0")
}
  1. map 方法(遍历与转换)若需在遍历过程中加工元素并返回新数组,map是理想选择,它会返回一个由加工后元素组成的新数组:
const arr = [1, 2, 3, 4, 5, 6];
const newArr = arr.map(item => item + 1); // 新数组:[2, 3, 4, 5, 6, 7]

四、总结

数组作为 JavaScript 中最常用的数据结构,其创建与遍历方式的选择直接影响代码的效率与可读性。简单总结:

  • 已知元素用字面量创建,未知元素用new Array().fill()初始化;
  • 性能优先选传统计数循环,可读性优先选for...of
  • 无需中断的遍历用forEach,元素转换用map
  • 避免用for...in遍历数组。

掌握这些知识,能让你在处理数组时更加得心应手,写出高效且易维护的代码。