ES6 给数组加了两个「偷懒糖」:解构(一把把格子里的东西全抓出来摆桌上)和 ... 三个点(把整排格子摊平散开)。代码能短一半,但藏着一个大坑——直接写 = 不是复制一份,而是两个人共用同一间房。
以前取前三个值得写三行,ES6 解构一行按顺序对齐赋值。注意是按格子顺序对上,不是按名字。
let arr = [10, 20, 30]; // 解构:按位置一个个接出来 let [a, b, c] = arr; // a接10,b接20,c接30 console.log(a, b, c); // 10 20 30 // 只想要前两个,后面不管 let [x, y] = arr; // 交换两个数,一行搞定 let m = 5, n = 10; [m, n] = [n, m]; // m 和 n 互换,不用临时杯
三个点 ... 能把数组拆成一个个单独的值,常用三件事:复制一份、合并、去重。
// ① 复制一份全新数组 const arr = [10, 20, 30]; const newArr = [...arr]; // 摊开后重新包一遍,互不相干 // ② 把两排拼成一排 let arr1 = [1,2], arr2 = [3,4]; let merge = [...arr1, ...arr2]; // [1,2,3,4] // ③ 配 Set 去重(工作中最常用) const dup = [1,2,2,3,3,3]; // 有重复 const unique = [...new Set(dup)]; // Set 自动去重,...再转回数组 → [1,2,3]
如果你写 arr2 = arr1 以为是复制了一份,就会踩坑。因为数组是「引用类型」(第11节细讲),= 只是把同一间房的钥匙又配了一把给 arr2,两个变量指向同一排格子。改一个,另一个也跟着变。真想复制一份,必须用 [...arr]。
let arr1 = [1,2,3]; let arr2 = arr1; // 只是再配一把钥匙进同一间房 arr2.push(99); // 用钥匙往房里加了个99 console.log(arr1); // 开门一看,arr1 也变成 [1,2,3,99] let arr3 = [...arr1]; // 这次是真复制了一份新房 arr3.push(7); // 改新房 console.log(arr1); // 老房不受影响,还是 [1,2,3,99]
如果你用 arr.reverse() 又不想动原数组,就会踩坑。因为它是「原地」反转,原来的数组就变了。不想动原数组,就先复制再反转:[...arr].reverse()。点下面按钮对比两种写法。
① 用在哪:交换两个变量、合并两个列表、标签去重 [...new Set(arr)]。
② 常见坑:arr2 = arr1 后改 arr2 连累 arr1;reverse() 把原列表反过来了。
③ 怎么解决:要独立就 [...arr] 复制;要反着用就 [...arr].reverse(),别直接动原数组。