ES6扩展运算符(三点运算符)“...”用法和对象拷贝

es6拷贝数组对象有以下方法:

方法一: Object.assign()
// 对象浅拷贝,obj1复制给obj2,这种方法要把obj2设置为{},不能const obj2 = "";
const obj1 = {a: 1};
const obj2 = {};
Object.assign( obj2, obj1)

方法二 :ES6扩展运算符(...)
//对象浅拷贝,obj1复制给obj2
const obj1 = {a: 1};
const obj2 = {...obj1};

方法三 :深拷贝
//对象深拷贝,obj1复制给obj2
const obj1 = {a: 1};
const obj2 = JSON.parse(JSON.stringify(obj1));

所谓深拷贝和浅拷贝:

const obj1 = {a: 1};
const obj2 =  obj1
obj2.a = 2
console.log(obj1)   //{a:2}

像这种直接赋值的方式其实是obj2引用obj1,二者指向同一个存储地址,无论改变哪一个二者都会受影响。

对于简单数组对象(不含有引用数据类型),可以用浅拷贝方法来消除这种关联影响。

对于复杂数组对象(含有引用数据类型,比如:{a:1,b:[1,2,3],c:{d:3}} 多层嵌套类型的),则需要用深拷贝方法。

在实际项目中,通常会这样:

this.selectEvaluate({param: param, showLoading: true}).then((res) => {
      if (res.data) {         console.log(res.data)
         this.evaluationInfo = res.data
      } else {
         ...
      }
})

console.log打印出来会发现res.data数据结构发生了一些变化,多了一些对象的get和set函数,这样的直接赋值是一种引用,虽然不会对数据产生出bug,但是如果其他地方也需要使用到res.data,像这样的:

this.selectEvaluate({param: param, showLoading: true}).then((res) => {
      if (res.data) {
         console.log(res.data)
         this.evaluationInfo = res.data
         this.selectEvaluationInfo = res.data
      } else {
         ...
      }
})

这种情况下需要用对象拷贝方法来区分,可以使用三点运算符写法比较简便:

this.selectEvaluate({param: param, showLoading: true}).then((res) => {
      if (res.data) {
         console.log(res.data)
         this.evaluationInfo = {...res.data}
         this.selectEvaluationInfo = {...res.data}
      } else {
         ...
      }
})

拷贝对象只是三点运算符的一种用法,它还有其他多种用法,常用于数组序列化:

function f(x, y, z) {
    // ...
}
var args = [0, 1, 2];
f(...args)

原文地址:https://www.cnblogs.com/wy90s/p/9778150.html

时间: 2024-08-11 03:55:27

ES6扩展运算符(三点运算符)“...”用法和对象拷贝的相关文章

es6 扩展运算符 三个点(...)

1  含义 扩展运算符( spread )是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) // 1 2 3 console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5 [...document.querySelectorAll('div')] // [<div>, <div>, <div>] 该运算符主要用于函数调用. function push(

javascript ES6 新特性之 扩展运算符 三个点 ...

对于 ES6 新特性中的 ... 可以简单的理解为下面一句话就可以了: 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中. 作用类似于 Object.assign() 方法,我们先来看一下 Object.assign() 方法: Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象.如下: const target = { a: 1, b: 2 }; const source = { b: 4, c: 5

es6~扩展运算符(未完)

扩展运算符 含义 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) //1 2 3 console.log(1, ...[2, 3, 4], 5) //1 2 3 4 5 [...document.querySelectorAll('div')] //[<div>, <div>, <div>] 该运算符主要用于函数调用. function push(ar

es6~扩展运算符后续

对象的扩展运算符 扩展运算符(...).ES2018 将这个运算符引入了对象. 解构赋值 对象的解构赋值用于从一个对象取值,相当于将目标对象自身的所有可遍历的(enumerable).但尚未被读取的属性,分配到指定的对象上面.所有的键和它们的值,都会拷贝到新对象上面. let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 }; x // 1 y // 2 z // { a: 3, b: 4 } 上面代码中,变量z是解构赋值所在的对象.它获取等号右边的所有尚未

2. es6扩展运算符

1. es扩展运算符 扩展运算符将一个数组转为用逗号分隔的参数序列: <script> console.log(...[1, 2, 3]) //1 2 3 // (1)将一个数组,变为参数序列 let add = (x, y) => x + y; let numbers = [1, 2]; console.log(add(...numbers))//3 // (2)使用扩展运算符展开数组代替apply方法,将数组转为函数的参数 // ES5 取数组最大值 console.log(Math

ES6系列_4之扩展运算符和rest运算符

运算符可以很好的为我们解决参数和对象数组未知情况下的编程,让我们的代码更健壮和简洁. 运算符有两种:对象扩展运算符与rest运算符. 1.对象扩展( spread)运算符(...) (1)解决参数个数问题 以前我们编程是传递的参数一般是确定,否则将会报错或者异常,如下: function test(a,b,c,d) { console.log(a) console.log(b) console.log(c) console.log(d) console.log(e)//e is not defi

JavaSE学习笔记(三)——运算符与控制语句

一.   Java中的运算符 在Java中,按功能划分主要包含一下运算符. 1.算术运算符 2.关系运算符 3.布尔运算符 4.赋值运算符 5.字符串连接运算符 6.条件运算符 7.其他运算符,如:instanceof,new 1.1           算术运算符 算术运算符: 算术运算符 描述 + 相加 - 相减 * 相乘 / 返回整除的值 % 返回余数 ++ 自加一,如果++出现在变量的前面,先自加一在进行其他运算 如果++出现在变量的后面,先进行其他运算在自加一 -- 自减一,原理同上

java第三天(运算符、键盘录入和控制语句)

1:运算符(掌握) (1)算术运算符 A:+,-,*,/,%,++,-- B:+的用法 a:加法 b:正号 c:字符串连接符 C:/和%的区别 数据做除法操作的时候,/取得是商,%取得是余数 D:++和--的用法 a:他们的作用是自增或者自减 b:使用 **单独使用 放在操作数据的前面和后面效果一样. a++或者++a效果一样. **参与操作使用 放在操作数的前面:先自增或者自减,再参与操作 int a = 10; int b = ++a; 放在操作数的后面:先参与操作,再自增或者自减 int

Java基础学习第三天——运算符与流程控制语句

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.02.22 lutianfei none 运算符 算术运算符 赋值运算符 比较运算符 逻辑运算符 位运算符 三目运算符 算术运算符 * 注:整数相除只能得到整数,若想得到小数,只需将任意一个数据变为浮点数. * eg:System.out.println(x*1.0/y); ++,– : 放在操作数前面,先自增或者自减,然后再参与运算. 放在操作数后面,先参与运算,再自增或者自减. 练习题1: int a=10,b=1