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

JavaScript中将数组push进数组后外部打印存储值全部消失问题

问题原因

JavaScript 中数组是引用类型,你代码中每次调用res.push(temp)时,实际存入res的是temp数组的内存引用,而非当前temp数组的值副本。
后续递归回溯过程中你持续对temp执行push、pop操作修改同一个数组对象,递归完全执行结束后temp会被清空为[],res中存储的所有引用最终都指向这个空数组,所以外部打印时看到全是空数组。
你执行过程中打印res看起来结果正常,只是因为打印那一刻temp刚好是当前生成的排列值,本质上res里的所有元素从始至终都指向同一个temp数组,你贴的执行日志里比如第二次输出[ [ 1, 3 ], [ 1, 3 ] ]其实已经暴露出问题了,正确的中间结果应该是[[1,2],[1,3]]才对。

解决方法

只需要修改往res中存值的逻辑,存入temp的浅拷贝副本即可,避免所有元素指向同一个引用:
把你代码里的

res.push(temp);

替换为

// 两种写法选一种即可,都是生成当前temp的浅拷贝数组
res.push([...temp]);
// 或者 res.push(temp.slice());

修改后的完整可运行代码:

var res = [];
var temp = [];

function Permutations(target, size) {
  if (size === 0) {
    // 存入temp的副本,而非原引用
    res.push([...temp]);
    console.log(res);
    return;
  }

  for (let i = 0; i < target.length; i++) {
    if (target[i] !== null) {
      temp.push(target[i]);
      target[i] = null;

      Permutations(target, size - 1);

      target[i] = temp.pop();
    }
  }
}

Permutations([1, 2, 3], 2);
console.log(res); // 最终输出 [[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:06:08