
扩展运算符 ... 是什么
它不是函数也不是方法,而是一种语法糖,用于把可迭代对象(如数组、字符串、类数组)或对象“展开”成独立的元素。本质是把一个整体“打散”,让内部项能被直接使用。
数组中用 ... 合并或浅拷贝
常见于合并多个数组、给函数传参、快速复制数组。注意:只做一层浅拷贝,嵌套数组/对象仍共享引用。
- 合并数组:
[...arr1, ...arr2] - 函数调用传参:
Math.max(...numbers),比Math.max.apply(null, numbers)更直观 - 浅拷贝:
const newArr = [...oldArr],比oldArr.slice()或Array.from(oldArr)更简洁 - 错误用法:
[...null]或[...undefined]会直接报错TypeError: null is not iterable
对象中用 ... 解构与合并
只能用于对象字面量中,且必须在最后一个位置;用于提取已有属性或合并多个对象。不能像数组那样用在函数参数里(那是剩余参数,语法相同但语义不同)。
技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作
- 合并对象:
{ ...obj1, ...obj2 },后者属性覆盖前者(同名 key) - 提取部分属性:
const { a, b, ...rest } = obj,rest是不含a、b的新对象 - 注意顺序:
{ ...obj1, x: 1, ...obj2 }中,obj2会覆盖x: 1,因为后写的生效 - 不能展开
null或undefined:{ ...null }报错TypeError: Cannot spread non-iterable null
和剩余参数 ... 容易混淆的点
写法一样,但出现位置和作用完全不同:扩展运算符在「等号右侧」或「函数调用时」,用于展开;剩余参数在「函数参数列表末尾」或「解构左侧」,用于收集成数组。
立即学习“Java免费学习笔记(深入)”;
- 扩展:
fn(...arr)、[...arr]、{...obj} - 剩余:
function fn(a, b, ...rest) {}、const [a, b, ...rest] = arr - 同一行里可能共存:
const [first, ...others] = [...arr]—— 右边是扩展,左边是剩余 - 剩余参数不支持对象解构:
const { a, ...rest } = obj合法,但function fn({ a, ...rest }) {}会语法报错
const arr = [1, 2];
console.log(...arr); // 1 2
console.log([...arr, 3]); // [1, 2, 3]
const obj = { a: 1, b: 2 };
console.log({ ...obj, c: 3 }); // { a: 1, b: 2, c: 3 }
const { a, ...rest } = obj;
console.log(rest); // { b: 2 }
真正容易出问题的地方不在语法,而在误以为 ... 能深拷贝、能展开非可迭代值、或混淆它和剩余参数的上下文。写之前先看清楚它在等号哪一边、在函数定义还是调用里。










