时间:2021-05-28
本文实例讲述了es6数组之扩展运算符操作。分享给大家供大家参考,具体如下:
扩展运算符(spread)是三个点(…)。它好比rest参数的逆运算,将一个数组转为用逗号分隔的参数序列。
console.log(...[1, 2, 3])// 1 2 3console.log(1, ...[2, 3, 4], 5)// 1 2 3 4 5[...document.querySelectorAll('div')]该运算符主要用于函数调用。
function push(array, ...items) { array.push(...items)}function add(x, y) { return x + y}const numbers = [4, 38]add(...numbers) // 42上面代码中,array.push(…items)和add(…numbers)这两行,都是函数的调用,它们的都使用了扩展运算符。该运算符将一个数组,变为参数序列。
扩展运算符与正常的函数参数可以结合使用,非常灵活。
function f(v, w, x, y, z) {}const args = [0, 1]f(-1, ...args, 2, ...[3])扩展运算符后面还可以放置表达式。
const arr = [ ...(x > 0 ? ['a'] : []), 'b']如果扩展运算符后面是一个空数组,则不产生任何效果。
[...[], 1]注意,扩展运算符如果放在括号中,javaScript引擎就会认为这是函数调用。如果这时不是函数调用,就会报错。
(...[1, 2])// Uncaught SyntaxError: Unexpected numberconsole.log((...[1, 2]))// Uncaught SyntaxError: Unexpected numberconsole.log(...[1, 2])// 1 2上面前两种情况都会报错,因为扩展运算符所在的括号不是函数调用,而第三种情况console.log(…[1, 2])就不会报错,因为这时是函数调用。
下面是扩展运算符取代apply方法的一个实际的例子,应用Math.max方法,简化求出一个数组最大元素的写法。
// ES5的写法Math.max.apply(null, [14, 3, 77])// ES6的写法Math.max(...[14, 3, 77])// 等同于Math.max(14, 3, 77)上面代码中,由于javaScript不提供求数组最大元素的函数,所以只能套用Math.max函数,将数组转为一个参数序列,然后求最大值。有了扩展运算符以后,就可以直接用Math.max了。
另一个例子是通过push函数,将一个数组添加到另一个数组的尾部。
// ES5 的写法var arr1 = [0, 1, 2]var arr2 = [3, 4, 5]Array.prototype.push.apply(arr1, arr2)// ES6的写法let arr1 = [0, 1, 2]let arr2 = [3, 4, 5]arr1.push(...arr2)上面代码的ES5写法中,push方法的参数不能是数组,所以只好通过apply方法变通使用push方法。有了扩展运算符,就可以直接将数组传push方法。
下面是另外一个例子。
// ES5new (Date.bind.appy(Date, [null, 2015, 1, 1]))// ES6new Date(...[2015, 1, 1])扩展运算符的应用
1)复制数组
数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组。
const a1 = [1, 2]const a2 = a1 a2[0] = 2a1 // [2, 2]上面代码中,a2并不是a1的克隆,而是指向同一份数据的另一个指针,修改a2,会直接导致a1的变化。
ES5只能用变通方法来复制数组。
const a1 = [1, 2]const a2 = a1.concat()a2[0] = 2 a1 //[1, 2]ES6写法
const a1 = [1, 2]// 写法1const a2 = [...a1]// 写法2const [...a2] = a12)合并数组
扩展运算符提供了数组合并的新写法。
const arr1 = ['a', 'b']const arr2 = ['c']const arr3 = ['d', 'e']// ES5的合并数组arr1.concat(arr2, arr3)// ES6的合并数组[...arr1, ...arr2, ...arr3]不过,这两种方法都是浅拷贝,使用的时候需要注意。
const a1 = [{foo: 1}]const a2 = [{bar: 2}]const a3 = a1.concat(a2)const a4 = [...a1, ...a2]a3[0] === a1[0] // truea4[0] === a1[0] // true上面代码中,a3和a4是用两种不同方法合并而成的新数组,但是它们的成员都是对原数组成员的引用,这就是浅拷贝,如果修改了原数组的成员,会同步反映到新数组。
3)与解构赋值结合
扩展运算符可以与解构赋值结合起来,用于生成数组。
// ES5 a = list[0], rest = list.slice(1)// ES6[a, ...rest] = list下面是另外一些例子。
const [first, ...rest] = [1, 2, 3, 4, 5]first // 1rest // [2, 3, 4, 5]const [first, ...rest] = []first // undefinedrest // []如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。
const [...butLast, last] = [1, 2, 3, 4, 5];// 报错const [first, ...middle, last] = [1, 2, 3, 4, 5];// 报错(4)字符串
扩展运算符还可以将字符串转为真正的数组。
[...'hello']// [ "h", "e", "l", "l", "o" ]对于那些没有部署Iterator接口的类似数组的对象,扩展运算符就无法将其转为真正的数组。
let arrayLike = { '0': 'a', '1': 'b', length:2}// TypeError: Cannot spread non-iterable object.let arr = [...arrayLike];上面代码中,arrayLike是一个类似数组的对象,但是没有部署 Iterator 接口,扩展运算符就会报错。这时,可以改为使用Array.from方法将arrayLike转为真正的数组。
扩展运算符内部调用的是数据结构的 Iterator 接口,因此只要具有 Iterator 接口的对象,都可以使用扩展运算符,比如 Map 结构。
let map = new Map([ [1, 'one'], [2, 'two'], [3, 'three'],]);let arr = [...map.keys()]; // [1, 2, 3]感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。
更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了ES6扩展运算符用法。分享给大家供大家参考,具体如下:扩展运算符用三个点号表示,功能是把数组或类数组对象展开成一系列用逗号隔开的值,扩展运算符有以
本文实例讲述了ES6基础之数组和对象的拓展。分享给大家供大家参考,具体如下:数组的扩展1.拓展运算符('...'),它相当于rest参数的逆运算,用于将一个数组
本文实例讲述了JavaScript扩展运算符用法。分享给大家供大家参考,具体如下:扩展运算符格式扩展运算符格式很简单,就是三个点(…)重点:需要ES6语法支持扩
本文实例讲述了ES6扩展运算符和rest运算符用法。分享给大家供大家参考,具体如下:运算符可以很好的为我们解决参数和对象数组未知情况下的编程,让我们的代码更健壮
二维数组降维使用数组实例方法concat和ES6扩展运算符降维letarr=[1,2,[3,4],5];letarr1=[].concat(...arr);//