Search K
Appearance
Appearance
📊 SEO元描述:2024年最新JavaScript数组基本操作教程,详解数组索引访问、length属性特性、数组长度可写性。包含完整代码示例和实用技巧,适合前端开发者掌握JavaScript数组核心操作。
核心关键词:JavaScript数组基本操作2024、数组索引访问、数组length属性、JavaScript数组长度、数组基础操作
长尾关键词:JavaScript数组怎么访问元素、数组length属性可写吗、JavaScript数组索引越界、数组长度怎么修改
通过本节JavaScript数组基本操作,你将系统性掌握:
数组索引是什么?这是用于访问数组元素的数字标识符。数组索引从0开始,是JavaScript数组操作的基础机制,也是数据访问和操作的核心方式。
💡 学习建议:理解数组索引是从0开始的,这是编程中的重要概念
数组索引访问使用方括号语法读取和设置数组元素:
// 🎉 数组索引访问基本语法
const fruits = ['apple', 'banana', 'orange', 'grape', 'kiwi'];
// 读取数组元素
console.log(fruits[0]); // 'apple' - 第一个元素
console.log(fruits[1]); // 'banana' - 第二个元素
console.log(fruits[2]); // 'orange' - 第三个元素
console.log(fruits[4]); // 'kiwi' - 最后一个元素
// 使用变量作为索引
const index = 2;
console.log(fruits[index]); // 'orange'
// 使用表达式作为索引
console.log(fruits[1 + 1]); // 'orange' - fruits[2]
console.log(fruits[fruits.length - 1]); // 'kiwi' - 最后一个元素
// 设置数组元素
fruits[1] = 'mango';
console.log(fruits); // ['apple', 'mango', 'orange', 'grape', 'kiwi']
// 添加新元素
fruits[5] = 'pear';
console.log(fruits); // ['apple', 'mango', 'orange', 'grape', 'kiwi', 'pear']// 🎉 数组索引的动态操作
const numbers = [10, 20, 30];
// 动态读取
function getElement(arr, index) {
return arr[index];
}
console.log(getElement(numbers, 0)); // 10
console.log(getElement(numbers, 1)); // 20
// 动态设置
function setElement(arr, index, value) {
arr[index] = value;
return arr;
}
setElement(numbers, 1, 25);
console.log(numbers); // [10, 25, 30]
// 使用循环访问所有元素
const colors = ['red', 'green', 'blue'];
for (let i = 0; i < colors.length; i++) {
console.log(`Index ${i}: ${colors[i]}`);
}
// 输出:
// Index 0: red
// Index 1: green
// Index 2: blue
// 反向访问
for (let i = colors.length - 1; i >= 0; i--) {
console.log(`Reverse index ${i}: ${colors[i]}`);
}
// 输出:
// Reverse index 2: blue
// Reverse index 1: green
// Reverse index 0: red// 🔴 数组索引越界处理
const arr = ['a', 'b', 'c'];
// 读取越界索引
console.log(arr[5]); // undefined - 不存在的索引
console.log(arr[-1]); // undefined - 负数索引
console.log(arr[100]); // undefined - 远超范围的索引
// 设置越界索引
arr[5] = 'f';
console.log(arr); // ['a', 'b', 'c', empty × 2, 'f']
console.log(arr.length); // 6 - 长度自动扩展
// 中间的空位
console.log(arr[3]); // undefined - 空位
console.log(arr[4]); // undefined - 空位
// 检查索引是否存在
console.log(3 in arr); // false - 索引3不存在
console.log(5 in arr); // true - 索引5存在
// 安全的索引访问
function safeGet(arr, index) {
if (index >= 0 && index < arr.length) {
return arr[index];
}
return undefined;
}
console.log(safeGet(arr, 2)); // 'c'
console.log(safeGet(arr, 10)); // undefined
// 使用可选链操作符(ES2020)
const nestedArray = [
[1, 2, 3],
[4, 5, 6]
];
console.log(nestedArray[0]?.[1]); // 2
console.log(nestedArray[2]?.[1]); // undefined - 安全访问// 🎉 数组的特殊索引和属性
const arr = ['a', 'b', 'c'];
// 字符串索引(实际上是属性)
arr['custom'] = 'custom value';
arr['100'] = 'string index';
console.log(arr); // ['a', 'b', 'c', empty × 97, 'string index']
console.log(arr.custom); // 'custom value'
console.log(arr['custom']); // 'custom value'
console.log(arr[100]); // 'string index'
console.log(arr['100']); // 'string index'
// 非数字字符串索引不影响length
console.log(arr.length); // 101 (只有数字索引影响length)
// 使用Symbol作为索引
const sym = Symbol('test');
arr[sym] = 'symbol value';
console.log(arr[sym]); // 'symbol value'
// 遍历时的差异
console.log('=== for...in 遍历 ===');
for (const key in arr) {
console.log(`${key}: ${arr[key]}`);
}
console.log('=== Object.keys() ===');
console.log(Object.keys(arr));
console.log('=== 数组方法遍历 ===');
arr.forEach((value, index) => {
console.log(`${index}: ${value}`);
});length属性是什么?这是数组对象的内置属性,表示数组的长度。length属性不仅可以读取数组长度,还可以通过修改它来改变数组的大小,这是JavaScript数组的独特特性。
// 🎉 length属性基本特性
const fruits = ['apple', 'banana', 'orange'];
// 读取数组长度
console.log(fruits.length); // 3
// length属性是动态的
fruits.push('grape');
console.log(fruits.length); // 4
fruits.pop();
console.log(fruits.length); // 3
// length属性反映最大索引+1
const sparse = [];
sparse[10] = 'value';
console.log(sparse.length); // 11 (不是1)
console.log(sparse); // [empty × 10, 'value']
// 空位不影响length的计算
const withHoles = [1, , , 4];
console.log(withHoles.length); // 4
console.log(withHoles[1]); // undefined
console.log(withHoles[2]); // undefinedlength属性的可写性是JavaScript数组的重要特性:
// 🔴 修改length属性的影响
const numbers = [1, 2, 3, 4, 5];
console.log(numbers); // [1, 2, 3, 4, 5]
console.log(numbers.length); // 5
// 1. 减少length - 截断数组
numbers.length = 3;
console.log(numbers); // [1, 2, 3] - 后面的元素被删除
console.log(numbers.length); // 3
// 被删除的元素无法恢复
numbers.length = 5;
console.log(numbers); // [1, 2, 3, empty × 2]
console.log(numbers[4]); // undefined
// 2. 增加length - 扩展数组
const colors = ['red', 'green'];
colors.length = 5;
console.log(colors); // ['red', 'green', empty × 3]
console.log(colors.length); // 5
console.log(colors[3]); // undefined
// 3. 设置length为0 - 清空数组
const temp = [1, 2, 3, 4, 5];
temp.length = 0;
console.log(temp); // []
console.log(temp.length); // 0
// 这是清空数组的高效方法
function clearArray(arr) {
arr.length = 0;
return arr;
}
const testArray = [1, 2, 3];
clearArray(testArray);
console.log(testArray); // []// 🎉 length属性修改的实际应用场景
// 场景1:数组截断
function truncateArray(arr, maxLength) {
if (arr.length > maxLength) {
arr.length = maxLength;
}
return arr;
}
const longArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
truncateArray(longArray, 5);
console.log(longArray); // [1, 2, 3, 4, 5]
// 场景2:数组扩展到指定长度
function padArray(arr, targetLength, fillValue = undefined) {
if (arr.length < targetLength) {
const originalLength = arr.length;
arr.length = targetLength;
// 填充新增的位置
for (let i = originalLength; i < targetLength; i++) {
arr[i] = fillValue;
}
}
return arr;
}
const shortArray = [1, 2];
padArray(shortArray, 5, 0);
console.log(shortArray); // [1, 2, 0, 0, 0]
// 场景3:快速清空数组
function fastClear(arr) {
arr.length = 0; // 比 arr.splice(0) 更快
return arr;
}
// 场景4:移除数组末尾的空元素
function trimArray(arr) {
while (arr.length > 0 && arr[arr.length - 1] === undefined) {
arr.length--;
}
return arr;
}
const arrayWithUndefined = [1, 2, 3, undefined, undefined];
trimArray(arrayWithUndefined);
console.log(arrayWithUndefined); // [1, 2, 3]// 🎉 length属性与数组方法的交互
const arr = [1, 2, 3];
// 数组方法会自动更新length
arr.push(4);
console.log(arr.length); // 4
arr.pop();
console.log(arr.length); // 3
arr.unshift(0);
console.log(arr.length); // 4
// 直接设置索引也会更新length
arr[10] = 'ten';
console.log(arr.length); // 11
console.log(arr); // [0, 1, 2, 3, empty × 6, 'ten']
// 删除元素但不更新length
delete arr[1];
console.log(arr.length); // 11 - length不变
console.log(arr[1]); // undefined
console.log(arr); // [0, empty, 2, 3, empty × 6, 'ten']
// 使用splice删除会更新length
arr.splice(1, 1); // 删除索引1的元素
console.log(arr.length); // 10
console.log(arr); // [0, 2, 3, empty × 6, 'ten']数组动态操作是什么?这是指在运行时动态地增加、删除、修改数组元素的操作。掌握数组动态操作对于编写灵活高效的JavaScript代码至关重要。
// 🎉 动态添加数组元素的方法
const fruits = ['apple', 'banana'];
// 方法1:使用索引直接添加
fruits[fruits.length] = 'orange'; // 等同于push
console.log(fruits); // ['apple', 'banana', 'orange']
// 方法2:使用push方法(推荐)
fruits.push('grape');
console.log(fruits); // ['apple', 'banana', 'orange', 'grape']
// 方法3:使用unshift在开头添加
fruits.unshift('mango');
console.log(fruits); // ['mango', 'apple', 'banana', 'orange', 'grape']
// 方法4:使用splice在指定位置插入
fruits.splice(2, 0, 'kiwi'); // 在索引2插入'kiwi'
console.log(fruits); // ['mango', 'apple', 'kiwi', 'banana', 'orange', 'grape']
// 方法5:使用concat创建新数组
const moreFruits = fruits.concat(['pear', 'peach']);
console.log(moreFruits); // 包含所有水果的新数组
// 方法6:使用扩展运算符
const evenMoreFruits = [...fruits, 'strawberry', 'blueberry'];
console.log(evenMoreFruits);// 🎉 动态删除数组元素的方法
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// 方法1:使用pop删除最后一个元素
const lastElement = numbers.pop();
console.log(lastElement); // 10
console.log(numbers); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
// 方法2:使用shift删除第一个元素
const firstElement = numbers.shift();
console.log(firstElement); // 1
console.log(numbers); // [2, 3, 4, 5, 6, 7, 8, 9]
// 方法3:使用splice删除指定位置的元素
const removed = numbers.splice(2, 2); // 从索引2开始删除2个元素
console.log(removed); // [4, 5]
console.log(numbers); // [2, 3, 6, 7, 8, 9]
// 方法4:使用delete(不推荐,会留下空位)
delete numbers[1];
console.log(numbers); // [2, empty, 6, 7, 8, 9]
console.log(numbers.length); // 6 - length不变
// 方法5:使用filter创建新数组
const filtered = numbers.filter(num => num !== undefined);
console.log(filtered); // [2, 6, 7, 8, 9]
// 方法6:修改length属性截断
numbers.length = 3;
console.log(numbers); // [2, empty, 6]// 🔴 数组操作的性能对比
// 性能测试函数
function performanceTest(name, operation, iterations = 100000) {
console.time(name);
for (let i = 0; i < iterations; i++) {
operation();
}
console.timeEnd(name);
}
// 测试不同的数组清空方法
const testArray1 = new Array(1000).fill(1);
const testArray2 = new Array(1000).fill(1);
const testArray3 = new Array(1000).fill(1);
performanceTest('length = 0', () => {
const arr = [...testArray1];
arr.length = 0;
});
performanceTest('splice(0)', () => {
const arr = [...testArray2];
arr.splice(0);
});
performanceTest('pop() loop', () => {
const arr = [...testArray3];
while (arr.length > 0) {
arr.pop();
}
});
// 最佳实践建议
const bestPractices = {
// 添加元素
addToEnd: (arr, item) => arr.push(item), // 最快
addToStart: (arr, item) => arr.unshift(item), // 较慢,需要移动所有元素
addAtIndex: (arr, index, item) => arr.splice(index, 0, item), // 中等
// 删除元素
removeFromEnd: (arr) => arr.pop(), // 最快
removeFromStart: (arr) => arr.shift(), // 较慢,需要移动所有元素
removeAtIndex: (arr, index) => arr.splice(index, 1), // 中等
// 清空数组
clearArray: (arr) => arr.length = 0, // 最快
// 查找元素
findElement: (arr, item) => arr.indexOf(item), // 基本方法
findElementModern: (arr, item) => arr.includes(item) // ES2016方法
};通过本节JavaScript数组基本操作的学习,你已经掌握:
"掌握数组的基本操作是JavaScript编程的基础技能,为后续学习复杂的数组方法和算法打下坚实基础!"