es6之扩展运算符 三个点(…)

es6之扩展运算符 三个点(…)es6 之扩展运算符三个点 es6 之扩展运算符三个点 对象的扩展运算符数组的扩展运算符总结 es6 之扩展运算符三个点 对象的扩展运算符理解对象的扩展运算符其实很简单 只要记住一句话就可以 对象中的扩展运算符 用于取出参数对象中的所有可遍历属性 拷贝到当前对象之中 letbar a 1 b 2 letbaz z

es6之扩展运算符 三个点(…)

对象的扩展运算符

理解对象的扩展运算符其实很简单,只要记住一句话就可以:

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

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} 

利用上述特性就可以很方便的修改对象的部分属性。在redux中的reducer函数规定必须是一个纯函数(如果不是很清楚什么是纯函数的可以参考这里),reducer中的state对象要求不能直接修改,可以通过扩展运算符把修改路径的对象都复制一遍,然后产生一个新的对象返回。

这里有点需要注意的是扩展运算符对对象实例的拷贝属于一种浅拷贝。肯定有人要问什么是浅拷贝?我们知道javascript中有两种数据类型,分别是基础数据类型引用数据类型基础数据类型是按值访问的,常见的基础数据类型NumberStringBooleanNullUndefined,这类变量的拷贝的时候会完整的复制一份;引用数据类型比如Array,在拷贝的时候拷贝的是对象的引用,当原对象发生变化的时候,拷贝对象也跟着变化,比如:

let obj1 = { 
    a: 1, b: 2}; let obj2 = { 
    ...obj1, b: '2-edited'}; console.log(obj1); // {a: 1, b: 2} console.log(obj2); // {a: 1, b: "2-edited"} 

上面这个例子扩展运算符拷贝的对象是基础数据类型,因此对obj2的修改并不会影响obj1,如果改成这样:

let obj1 = { 
    a: 1, b: 2, c: { 
   nickName: 'd'}}; let obj2 = { 
    ...obj1}; obj2.c.nickName = 'd-edited'; console.log(obj1); // {a: 1, b: 2, c: {nickName: 'd-edited'}} console.log(obj2); // {a: 1, b: 2, c: {nickName: 'd-edited'}} 

这里可以看到,对obj2的修改影响到了被拷贝对象obj1,原因上面已经说了,因为obj1中的对象c是一个引用数据类型,拷贝的时候拷贝的是对象的引用。

数组的扩展运算符

扩展运算符同样可以运用在对数组的操作中。

  • 可以将数组转换为参数序列
function add(x, y) { 
    return x + y; } const numbers = [4, 38]; add(...numbers) // 42 
  • 可以复制数组

如果直接通过下列的方式进行数组复制是不可取的:

const arr1 = [1, 2]; const arr2 = arr1; arr2[0] = 2; arr1 // [2, 2] 

原因上面已经介绍过,用扩展运算符就很方便:

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

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

  • 扩展运算符可以与解构赋值结合起来,用于生成数组
const [first, ...rest] = [1, 2, 3, 4, 5]; first // 1 rest // [2, 3, 4, 5] 

需要注意的一点是:

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

const [...rest, last] = [1, 2, 3, 4, 5]; // 报错 const [first, ...rest, last] = [1, 2, 3, 4, 5]; // 报错 
  • 扩展运算符还可以将字符串转为真正的数组
[...'hello'] // [ "h", "e", "l", "l", "o" ] 
  • 任何 Iterator 接口的对象(参阅 Iterator 一章),都可以用扩展运算符转为真正的数组

这点说的比较官方,大家具体可以参考阮一峰老师的ECMAScript 6入门教程

比较常见的应用是可以将某些数据结构转为数组,比如:

// arguments对象 function foo() { 
    const args = [...arguments]; } 

用于替换es5中的Array.prototype.slice.call(arguments)写法。

总结

扩展运算符的用法就说到这里,介绍的不全但都是些最常见的用法。

下面的是我的公众号二维码图片,欢迎关注。
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201084.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午9:58
下一篇 2026年3月20日 上午9:59


相关推荐

  • 各大技术团队博客_如何扩大团队规模

    各大技术团队博客_如何扩大团队规模BAT技术团队博客1.美团技术团队博客: 地址: http://tech.meituan.com/2. 腾讯社交用户体验设计(ISUX)地址:http://isux.tencent.com/3. 京东设计中心地址:http://jdc.jd.com4. QQ游戏设计中心地址:ht

    2022年8月13日
    6
  • 离散数学总复习精华版(最全 最简单易懂)已完结

    离散数学总复习精华版(最全 最简单易懂)已完结离散数学期末总复习精华版P1命题逻辑的基本概念虽然是不确定但是可以是命题就是无法判断真假优先级P2命题逻辑等值演算第一种方法:真值表求第二种用等值演算求P3命题逻辑推理理论下面给出例题后面的可以写成前提引入T12下面给出反证法附加前提证明:…………

    2022年6月18日
    29
  • mongodb与mysql区别对比

    mongodb与mysql区别对比参考来源mongodb与关系型数据库相比的优缺点与关系型数据库相比,MongoDB的优点:①弱一致性(最终一致),更能保证用户的访问速度:举例来说,在传统的关系型数据库中,一个COUNT类型的操作会锁定数据集,这样可以保证得到“当前”情况下的较精确值。这在某些情况下,例如通过ATM查看账户信息的时候很重要,但对于Wordnik来说,数据是不断更新和增长的,这种“较精确”的保证几乎没有任何…

    2022年6月22日
    66
  • 左右presentViewController经background黑问题

    左右presentViewController经background黑问题

    2022年1月13日
    231
  • AUC值越大_AUC,ROC 讲解

    AUC值越大_AUC,ROC 讲解面试的时候 一句话说明 AUC 的本质和计算规则 AUC 一个正例 一个负例 预测为正的概率值比预测为负的概率值还要大的可能性 所以根据定义 我们最直观的有两种计算 AUC 的方法 1 绘制 ROC 曲线 ROC 曲线下面的面积就是 AUC 的值 2 假设总共有 m n 个样本 其中正样本 m 个 负样本 n 个 总共有 m n 个样本对 计数 正样本预测为正样本的概率值大于负样本预测为正样本的概率值记为 1 累加计数 然后除以 m

    2026年3月20日
    1
  • 脑力触发:记忆冠军的大脑训练术

    脑力触发:记忆冠军的大脑训练术你有一种骄傲 虽然受了伤害 但是不肯屈服 也许就是这种东西 把你的漂亮塑成了美丽 玛丽 瑞瑙特 波斯少年 要想改变自己的习惯 必须首先认识到这个问题 然后才能有意识地去改变 我们对自己感兴趣和想做的事情学得最快 为了能牢牢记住所学的知识 我们不仅要付出努力 还要有学习的动力 也就是我们要让自己兴奋起来 因为我们此时可以感受到所谓的积极压力 我们的大脑也可以借此顺利运转 当然 使用互联网会带来很多积极效果 但是神经生物学家和心理学家的研究证实 如果来自互联网页面的刺激过度 不仅会导致仓促的阅读 还会

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号