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

如何防止函数修改传入的参数?以x10数组操作函数为例

解决函数修改原数组的问题

你的问题核心在于JavaScript里数组是引用类型——当你写output = a的时候,并没有创建新数组,而是让output和a指向内存里的同一个数组对象。所以你对output执行的push操作,本质上就是在修改原数组a。

要实现「让y获得预期值,同时原数组a保持不变」的需求,你需要先创建原数组的独立副本,再对副本进行操作。这里有几种常用的实现方式:

方法1:使用数组slice()方法

slice()方法如果不传参数,会返回原数组的浅拷贝,刚好适配你的场景:

x10 = function(a,b) {
  // 创建原数组的副本,而非直接引用
  let output = a.slice();
  for(let i=0;i<b;i++) {
    output.push(0);
  }
  return output;
}

方法2:使用ES6扩展运算符

这是更简洁的现代写法,同样能生成原数组的浅拷贝:

x10 = function(a,b) {
  let output = [...a];
  for(let i=0;i<b;i++) {
    output.push(0);
  }
  return output;
}

方法3:使用Array.from()

ES6新增的Array.from()方法也可以快速生成原数组的浅拷贝:

x10 = function(a,b) {
  let output = Array.from(a);
  for(let i=0;i<b;i++) {
    output.push(0);
  }
  return output;
}

现在测试一下效果:

let a = [1];
print(a); // 输出 [1]
let y = x10(a,2);
print(a); // 依旧输出 [1],原数组未被修改
print(y); // 输出 [1,0,0],符合预期

另外提个小细节:你代码里的i没有用let/var声明,会变成全局变量,建议加上let来限定作用域,避免后续出现意外的变量污染问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:02:47