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

JavaScript中spread运算符在copyMachine习题中的作用是什么?

核心差异:引用和真实拷贝的区别

JS中数组是引用类型,直接push(arr)本质上是把原数组的内存地址引用添加到newArr里,并没有生成新的数组副本。你现在看到输出结果相同,只是因为你没有修改原数组的值,一旦修改原数组,所有push进去的元素都会同步变化,完全不符合题目要求的「拷贝arr」的规则。

举个实际测试的例子就能看出区别:

// 用push(arr)的错误写法
function badCopyMachine(arr, num) {
  let newArr = [];
  while (num >= 1) {
    newArr.push(arr);
    num--;
  }
  return newArr;
}

const originArr = [true, false, true];
const result = badCopyMachine(originArr, 2);
originArr[0] = "我被改了";
console.log(result); 
// 输出会变成:[ [ '我被改了', false, true ], [ '我被改了', false, true ] ]
// 所有子数组都跟着原数组变了,根本没有实现拷贝效果

而用[...arr]的写法,是通过展开运算符生成一个全新的数组副本,和原数组完全脱离引用关系,修改原数组不会影响到newArr里的子数组,这才是符合题目要求的拷贝实现:

const originArr = [true, false, true];
const result = copyMachine(originArr, 2);
originArr[0] = "我被改了";
console.log(result); 
// 输出还是:[ [ true, false, true ], [ true, false, true ] ]
// 拷贝出来的数组不受原数组修改的影响,符合需求

另外这道题本身的考点就是考察展开运算符做数组拷贝的用法,所以要求你用[...arr]的写法实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:39:03