You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《Eloquent JavaScript》中原地反转数组实现里的slice方法为何无法正常工作?

为什么你的slice()看起来没生效?

首先得澄清:你的slice()方法其实是正常工作的,你觉得它没生效,大概率是混淆了「函数返回值」和「原数组的状态」,咱们一步步拆解来看:

先跑一遍你的代码逻辑

假设调用reverseArrayInPlace(["a", "b", "c"]):

  1. 初始时,数组是["a", "b", "c"],长度为3。
  2. 循环从i=2(数组最后一个元素的索引)开始,每次把当前array[i]push到数组末尾:
    • 第一次循环:push "c" → 数组变成["a", "b", "c", "c"],count变成1
    • 第二次循环:push "b" → 数组变成["a", "b", "c", "c", "b"],count变成2
    • 第三次循环:push "a" → 数组变成["a", "b", "c", "c", "b", "a"],count变成3
  3. 最后执行array.slice(count),也就是array.slice(3)——这个方法会创建并返回一个新数组,包含原数组从索引3到末尾的元素:["c", "b", "a"]。

你看到的「整个数组」是什么?

如果你的console.log(reverseArrayInPlace(["a", "b", "c"]))输出的是["a", "b", "c", "c", "b", "a"],那大概率是你写错了代码(比如误写了return array而不是return array.slice(count))。但按你贴的代码,它的返回值应该是正确的反转数组。

那为什么你会觉得slice没生效?很可能是你额外打印了原数组——因为push是破坏性操作,它直接修改了传入的原数组,所以原数组会变成["a", "b", "c", "c", "b", "a"],但函数的返回值是slice生成的新数组,和原数组是两个独立的数组。

关键知识点:slice()是「非破坏性」方法

slice()永远不会修改原数组,它只会基于原数组的一部分内容创建一个新数组返回。你的代码里,这个逻辑是完全正确的,它确实返回了你想要的反转数组——只是原数组因为push被改变了,这可能让你误以为slice没起作用。

内容的提问来源于stack exchange,提问作者mc22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 13:48:12