玩转展开运算符

2022-12-17 0 451

ES2015(ES6) 追加了一类 基本上操作符——展开操作符 采用四个点 … 则表示

它的促进作用是在调用函数、数组内部内部结构时 将数组函数或数组在句法微观展开展开; 构筑字面上量的第一类时以数组对的方式展开展开。

下面他们来看一看它的基本上用语:

// 展开基本上的数组 const arr = [apple,orange,banana]; console.log(…arr); // apple orange banana // 动态上下面的句子而已在句法微观展开了数组arr 让arr中的每两个原素做为log函数的模块

构筑字面上量句法的数组

一般来说情况下构筑字面上量内部结构的数组他们会采用如 push splice unshift concat 等函数将原有数组做为新数组的一小部分。

展开操作符能更单纯加速的顺利完成此项组织工作。

const arr1 = [welcome,to]; const arr2 = [hello,…arr1,here]; // [“hello”, “welcome”, “to”, “here”]

链接数组

在拥有展开操作符以前 他们一般来说采用 concat 函数 展开数组的链接

const arr1 = [1,2,3]; const arr2 = [4,5]; const arr3 = arr1.concat(arr2); // [1,2,3,4,5]

数组拷贝

const arr1 = [1,2,3,4]; const arr2 = […arr1]; // [1,2,3,4]arr2.push(5,6); // 此时arr2 [1,2,3,4,5,6] arr1的结果不变 const arr3 = [[1,2,3],[4,5,6]]; const arr4 = […arr3]; // [[1,2,3],[4,5,6]]; arr4.pop().push(0); // 执行后 arr4 [[1,2,3]] // arr3 [[1,2,3],[4,5,6,0]]

从以上结果他们能看出 展开操作符只遍历展开数组的第一层(浅拷贝)。 展开的结果如果是引用类型则不继续向下遍历。 事实上它的行为和 Object.assign() 是相同的

第一类拷贝和合并

const obj1 = {username:zhangsan,age:25}; const obj2 = {username:wangwu,phone:13666666666} // 采用展开操作符拷贝第一类(浅拷贝) const copyObj = { obj1 }; // { username:zhangsan , age:25 } // 采用展开操作符合并第一类 const mergeObj = { obj1,…obj2 }; // { username:wangwu , age:25 , phone:13666666666 }

采用展开操作符展开新第一类内部内部结构 本质上是讲原有第一类中的所有 可枚举 属性拷贝到新第一类中; 与 Object.assign() 不同的是 Object.assign()会触发setters 展开操作符不会。

rest模块(剩余模块)

用arguments第一类了。rest模块搭配的变量是两个数组,该变量将多余的模块放入数组中。 这个特性能让他们在一些特定环境更方便的去处理模块(例如没有arguments的箭头函数)

let myFn = (…values) => { console.log(values); } myFn(1,3,5); // output: [1,3,5]

他们也能对部分模块采用rest模块,但是在rest模块后不能有其他模块(rest必须是最后两个模块)

let myFn = ( a, values ) => { if(Array.isArray(a)){ values.forEach(el=>{ a.push(el); }); } } let arr = [1,2,3]; myFn(arr,ok,!); // arr结果为 [1,2,3,ok,!] let testFn = (a, values , b) => {} // 报错

注意点: 在数组或函数模块中采用展开句法时, 只能用于 可迭代第一类(支持 iterator)

let o = {username:zhangsan}; let arr = […o]; // TypeError: o is not iterable

如何讲清楚函数防抖?

千锋HTML5学院:JS的奇葩句法(一)30 赞同 · 2 评论文章玩转展开运算符

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务