扩展运算符(...)的作用及使用场景

1、对象扩展运算符

对象的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中。

let bar = { a: 1, b: 2 };
let baz = { ...bar }; // { a: 1, b: 2 }

 上述方法等价于:

let bar = {a:1, b:2};
let baz = Object.assign({},bar);    // { a:1, b:2 }

Object.assign方法用于对象的合并,将原对象(source)的所有可以枚举属性,复制到目标对象(target)。

注:Object.assign 方法的第一个参数是目标对象, 后面的参数都是源对象。 (如果目标对象与源对象有同名属性, 或多个源对象有同名属性, 则后面的属性会覆盖前面的属性)。

同样, 如果用户自定义的属性, 放在扩展运算符后面, 则扩展运算符内部的同名属性会被覆盖掉。

let bar = { a:1, b:2 }
let baz = {...bar,...{a:2, b:4}}    // {a:2, b:4}

: 扩展运算符对对象实例的拷贝属于浅拷贝


2、数组扩展运算符

数组的扩展运算符可以将一个数组转为用逗号分隔的参数序列,且每次只能展开一层数组。

console.log(...[1, 2, 3])                // 1 2 3
console.log(...[1, [2, 3, 4], 5])        // 1 [2, 3, 4] 5

复制数组

const arr1 = [1, 2];
const arr2 = [...arr1];

合并数组

const arr1 = ['two', 'three'];
const arr2 = ['one', ...arr1, 'four', 'five'];
​​​​​​​// ["one", "two", "three", "four", "five"]

扩展运算符与解构赋值结合起来,用于生成数组

const [first, ...rest] = [1, 2, 3, 4, 5]; 
first // 1    
rest  // [2, 3, 4, 5]

 (如果将扩展运算符用于数组赋值, 只能放在参数的最后一位, 否则会报错。)

使用   Math函数获取数组中特定的值​​​​​​​

const numbers = [9, 4, 7, 1];
Math.min(...numbers); // 1
Math.max(...numbers); // 9

: 扩展运算符(…)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中,这里参数对象是个数组,数组里面的所有对象都是基础数据类型,将所有基础数据类型重新拷贝到新的数组中。

<think>嗯,我现在得仔细想想怎么回答用户关于Object.assign()扩展运算符...在浅克隆对象中的使用。用户可能想了解这两个方法的区别、用法以及注意事项。首先,我应该回忆一下这两个方法的基本概念。 Object.assign()方法是ES6引入的,用于将所有可枚举的自有属性从一个或多个源对象复制到目标对象,然后返回目标对象。而扩展运算符...也是ES6的功能,可以在对象字面量中展开,将源对象的属性拷贝到新对象中。 接下来,我需要确认两者的语法和基本用法。比如,Object.assign(target, ...sources),其中目标对象会被修改,而扩展运算符则是创建一个新对象,比如const cloned = {...original}。 然后,要说明它们都是浅克隆。浅克隆意味着如果属性是对象,拷贝的是引用而不是对象本身。因此,修改嵌套对象会影响原对象和克隆后的对象。这点需要举例说明,比如原对象有属性a,而a是一个对象,克隆后修改克隆对象的a属性里的值,原对象也会变。 可能还需要比较两者的异同。比如,Object.assign()可以合并多个对象,而扩展运算符在对象字面量中也可以合并多个,比如{...obj1, ...obj2}。同时,两者的属性覆盖规则相似,后面的属性会覆盖前面的同名属性。 用户可能想知道在实际开发中如何选择。比如,如果只需要合并到一个新对象而不修改原对象,可以用空对象作为目标:Object.assign({}, obj)。而扩展运算符写起来更简洁,特别是在合并多个对象时。 还要注意特殊情况,比如原型链上的属性不会被复制,因为两者都只复制自有属性。此外,不可枚举的属性也不会被复制,比如用Object.defineProperty定义的enumerable为false的属性。 可能需要举例说明浅克隆的问题,比如原对象有数组或嵌套对象,克隆后修改这些结构会影响到原对象。这时候应该提醒用户深克隆的方法,比如JSON.parse(JSON.stringify(obj))或者使用库函数,但这不是当前问题的重点。 最后,总结两者的适用场景使用时的注意事项,确保用户理解浅克隆的局限性,并根据情况选择合适的方法。</think>好的!下面分步介绍`Object.assign()`和扩展运算符`...`在实现对象浅克隆时的用法及注意事项: --- ### 一、`Object.assign()` 实现浅克隆 **语法**: ```javascript const clonedObj = Object.assign({}, originalObj); ``` **步骤解析**: 1. **创建空对象**:`{}` 作为目标对象,确保不修改原始对象。 2. **复制属性**:将`originalObj`的所有可枚举自有属性复制到新对象。 3. **返回结果**:返回合并后的新对象`clonedObj`。 **示例**: ```javascript const obj = { a: 1, b: { c: 2 } }; const cloned = Object.assign({}, obj); cloned.a = 100; // 修改基本类型,原对象不变 cloned.b.c = 200; // 修改嵌套对象,原对象也会改变! console.log(obj); // { a: 1, b: { c: 200 } } ``` --- ### 二、扩展运算符 `...` 实现浅克隆 **语法**: ```javascript const clonedObj = { ...originalObj }; ``` **步骤解析**: 1. **展开对象**:`...originalObj` 将原对象的属性展开到新对象字面量中。 2. **创建新对象**:直接生成新对象`clonedObj`,无需显式指定目标。 **示例**: ```javascript const obj = { a: 1, b: { c: 2 } }; const cloned = { ...obj }; cloned.a = 100; // 原对象不变 cloned.b.c = 200; // 原对象的嵌套对象被修改! console.log(obj); // { a: 1, b: { c: 200 } } ``` --- ### 三、关键区别与共同点 | 特性 | Object.assign() | 扩展运算符 `...` | |--------------------|-------------------------|------------------------| | **多对象合并** | 支持:`Object.assign({}, obj1, obj2)` | 支持:`{ ...obj1, ...obj2 }` | | **原型链属性** | 不复制 | 不复制 | | **Symbol属性** | 复制 | 复制 | | **代码简洁性** | 一般 | 更简洁 | --- ### 四、浅克隆的局限性 - **嵌套对象问题**:若属性值为对象(如数组、其他对象),仅复制引用,修改会联动原始对象。 - **深克隆解决方案**: ```javascript // 方法1:JSON(不支持函数/Symbol) const deepClone = JSON.parse(JSON.stringify(obj)); // 方法2:递归函数或使用库(如 lodash.cloneDeep) ``` --- ### 五、如何选择? - **简单场景**:优先用扩展运算符`...`,语法简洁。 - **兼容性要求**:低版本环境用`Object.assign()`(需 polyfill)。 - **合并多对象**:两者均可,根据代码风格选择。 希望以上解析能帮助你理解这两种浅克隆方法! 😊
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值