如何防止函数修改传入的参数?以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
相关产品推荐
相关产品推荐

