《Eloquent JavaScript》中原地反转数组实现里的slice方法为何无法正常工作?
为什么你的
slice()看起来没生效? 首先得澄清:你的slice()方法其实是正常工作的,你觉得它没生效,大概率是混淆了「函数返回值」和「原数组的状态」,咱们一步步拆解来看:
先跑一遍你的代码逻辑
假设调用reverseArrayInPlace(["a", "b", "c"]):
- 初始时,数组是
["a", "b", "c"],长度为3。 - 循环从
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
- 第一次循环:push "c" → 数组变成
- 最后执行
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
相关产品推荐
相关产品推荐

