一、含义:
在函数调用或者数组构造时 将数组表达式或者string在语法层面展开;
在构造字面量对象时,将表达式以key:value的格式展开。
二、用法:
1、展开 string类型 (空格的原因其实是用 ,展开,后面转为了空格)
let str = '123string'
console.log('string---', ...str); //string--- 1 2 3 s t r i n g
2、展开数组类型的数据(不能直接展开对象)
let str2 = [1, 2, 3, 4, { obj: '11' }]
console.log('array--str2-', ...str2); //array--str2- 1 2 3 4 {obj: '11'}
let _str2 = [1, 2, ...str2]
console.log('array---', _str2); // [1, 2, 1, 2, 3, 4, {obj: '11'}]
// 不能直接展开对象
let obj ={
aa: '1',
bb: 'b'
}
console.log('展开对象',...obj);
// 通过拷贝之后就可以 使用
let newObj = {...obj};
console.log('展开对象',newObj);
3、*可以进行 一层 的深拷贝
let str2 = [1, 2, 3, 4, { obj: '11' }]
let strr2 = str2;
let new_str2 = [...str2]
// 数组属于复杂数据类型
// 复杂数据类型 通过引用(内存里的位置)比较的,不像基本类型是通过值比较的。所以两个相同值的对象(数组),也是不==的
// 所以通过这种方式可以进行 深拷贝 (浅拷贝的话 会==并且=== ),但也只能 深拷贝一层
// new_str2[4].obj = "00" ----改变第二层,原来的会会跟着改变
new_str2[0] = 5; ----改变第一层,原来的不会跟着改变
console.log('array---深拷贝', str2);
console.log('array---深拷贝', new_str2);
console.log('array---深拷贝', str2 == new_str2); //不管第几层都为false,因为第一层的地址不一样
// 我是这样理解的,浅拷贝的话,复杂数据类型存储的是引用的地址!对于对象来说是通过引用比较 是否==的,所以它为false的话,应该是深拷贝,为true的话代表着两个地址一致,所以为浅拷贝 (对于第一层而言)
4、用于传参
let str2 = [1, 2, 3, 4, { obj: '11' }]
fun(...str2)
// 会取str中的前三个作为 形参abc
function fun(a, b, c) {
console.log(a, b, c); //1 2 3
}
5、作为剩余参数
// 1、作为 剩余参数
fun2('a', 'b', ...str2)
// function fun2(a, b, c) {
// 接受前三个
// console.log(a, b, c);
// }
//2、arguments对象
function fun2() {
// arguments对象 接受所有实参
// console.log(arguments);
// item 这里遍历的是每一项,而不是索引
for (let item of arguments) {
console.log('i', item);
}
}