javascript中实现数组反转最直接的方法是使用array.prototype.reverse(),但该方法会原地修改原数组,因此在需要保留原数组时应先创建副本。1. 使用扩展运算符[...arr].reverse()或slice().reverse()可避免修改原数组,前者语法更直观;2. 手动实现可采用循环从末尾遍历并推入新数组,逻辑清晰适合初学者;3. 利用reduceright()从右向左累加元素,函数式风格更优雅且适合链式操作;4. 双指针交换法适用于需原地反转的场景,节省内存,常见于算法题或性能敏感环境。选择方法时需权衡数据不可变性、性能、可读性与编码风格,日常开发推荐[...arr].reverse(),复杂场景可依需求选用手动实现方式。

JavaScript中实现数组反转,最直接且常用的方法是使用内置的
Array.prototype.reverse()
slice()
最简单粗暴,也是我们日常开发中最常用的方法,就是调用数组实例的
reverse()
let originalArray = [1, 2, 3, 4, 5]; let reversedArray = originalArray.reverse(); console.log(reversedArray); // 输出: [5, 4, 3, 2, 1] console.log(originalArray); // 输出: [5, 4, 3, 2, 1] (原数组已被修改)
reverse()
在我看来,
reverse()
所以,当你需要反转数组,但又不想动到原始数据时,直接调用
reverse()
常见的复制方法有两种,都挺简洁的:
使用扩展运算符 (...
let original = [1, 2, 3]; let reversedCopy = [...original].reverse(); // 创建一个新数组再反转 console.log(reversedCopy); // [3, 2, 1] console.log(original); // [1, 2, 3] (原数组未变)
使用slice()
slice()
let original = [1, 2, 3]; let reversedCopy = original.slice().reverse(); // 复制一份再反转 console.log(reversedCopy); // [3, 2, 1] console.log(original); // [1, 2, 3] (原数组未变)
这两种方式都能达到目的,在我看来,扩展运算符在可读性上可能略胜一筹,因为它更直观地表达了“创建一个新数组”的意图。
除了上面提到的先复制再反转的方法,其实还有一些不那么直接,但同样能达到不修改原数组目的的手段。有时候,我们可能需要更精细的控制,或者在特定场景下,比如面试中被要求“手写一个不依赖
reverse()
循环迭代法(创建新数组):这是最直观的“手写”方式之一。从原数组的末尾开始遍历,然后将每个元素依次添加到新数组中。
function reverseArrayManually(arr) {
let newArr = [];
for (let i = arr.length - 1; i >= 0; i--) {
newArr.push(arr[i]);
}
return newArr;
}
let myArr = ['a', 'b', 'c'];
let reversedMyArr = reverseArrayManually(myArr);
console.log(reversedMyArr); // ['c', 'b', 'a']
console.log(myArr); // ['a', 'b', 'c'] (原数组未变)这种方法的好处是逻辑清晰,容易理解,对于初学者来说,它能帮助你更好地理解数组元素的访问和操作。
使用reduceRight()
reduceRight()
let data = [10, 20, 30];
let reversedData = data.reduceRight((acc, current) => {
acc.push(current);
return acc;
}, []); // 初始累加器为一个空数组
console.log(reversedData); // [30, 20, 10]
console.log(data); // [10, 20, 30] (原数组未变)reduceRight()
当内置的
reverse()
双指针交换法(原地反转,但我们通常用reverse()
reverse()
function customReverseInPlace(arr) {
let left = 0;
let right = arr.length - 1;
while (left < right) {
// 交换元素
let temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
// 移动指针
left++;
right--;
}
return arr; // 返回被修改后的原数组
}
let arrToModify = [1, 2, 3, 4, 5];
customReverseInPlace(arrToModify);
console.log(arrToModify); // [5, 4, 3, 2, 1]适用场景:
迭代倒序构建新数组法: 这个方法就是前面提到的从数组末尾开始遍历,然后
push
function reverseToNewArray(arr) {
const reversed = [];
for (let i = arr.length - 1; i >= 0; i--) {
reversed.push(arr[i]);
}
return reversed;
}
let originalData = ['a', 'b', 'c', 'd'];
let newData = reverseToNewArray(originalData);
console.log(newData); // ['d', 'c', 'b', 'a']
console.log(originalData); // ['a', 'b', 'c', 'd']适用场景:
reduce()
reduceRight()
// 使用 reduce() 从左到右,每次 unshift
function reverseWithReduce(arr) {
return arr.reduce((acc, current) => {
acc.unshift(current); // 每次将当前元素添加到累加器数组的开头
return acc;
}, []);
}
// 使用 reduceRight() 从右到左,每次 push (前面已演示)
// function reverseWithReduceRight(arr) {
// return arr.reduceRight((acc, current) => {
// acc.push(current);
// return acc;
// }, []);
// }
let items = [100, 200, 300];
console.log(reverseWithReduce(items)); // [300, 200, 100]
console.log(items); // [100, 200, 300]适用场景:
reduce
reduce
map
filter
for
reduce
在我看来,选择哪种方法,很大程度上取决于你对“性能”、“可读性”、“数据不可变性”以及“特定场景需求”的权衡。对于大多数日常任务,
[...arr].reverse()
arr.slice().reverse()
以上就是js如何实现数组反转的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号