es6数组之扩展运算符操作实例分析
本文实例讲述了es6数组之扩展运算符操作。分享给大家供大家参考,具体如下:
扩展运算符(spread)是三个点(…)。它好比rest参数的逆运算,将一个数组转为用逗号分隔的参数序列。
console.log(...[1,2,3]) //123 console.log(1,...[2,3,4],5) //12345 [...document.querySelectorAll('div')]
该运算符主要用于函数调用。
functionpush(array,...items){ array.push(...items) } functionadd(x,y){ returnx+y } constnumbers=[4,38] add(...numbers)//42
上面代码中,array.push(…items)和add(…numbers)这两行,都是函数的调用,它们的都使用了扩展运算符。该运算符将一个数组,变为参数序列。
扩展运算符与正常的函数参数可以结合使用,非常灵活。
functionf(v,w,x,y,z){} constargs=[0,1] f(-1,...args,2,...[3])
扩展运算符后面还可以放置表达式。
constarr=[ ...(x>0?['a']:[]), 'b' ]
如果扩展运算符后面是一个空数组,则不产生任何效果。
[...[],1]
注意,扩展运算符如果放在括号中,javaScript引擎就会认为这是函数调用。如果这时不是函数调用,就会报错。
(...[1,2]) //UncaughtSyntaxError:Unexpectednumber console.log((...[1,2])) //UncaughtSyntaxError:Unexpectednumber console.log(...[1,2]) //12
上面前两种情况都会报错,因为扩展运算符所在的括号不是函数调用,而第三种情况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的写法 vararr1=[0,1,2] vararr2=[3,4,5] Array.prototype.push.apply(arr1,arr2) //ES6的写法 letarr1=[0,1,2] letarr2=[3,4,5] arr1.push(...arr2)
上面代码的ES5写法中,push方法的参数不能是数组,所以只好通过apply方法变通使用push方法。有了扩展运算符,就可以直接将数组传push方法。
下面是另外一个例子。
//ES5 new(Date.bind.appy(Date,[null,2015,1,1])) //ES6 newDate(...[2015,1,1])
扩展运算符的应用
1)复制数组
数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组。
consta1=[1,2] consta2=a1 a2[0]=2 a1//[2,2]
上面代码中,a2并不是a1的克隆,而是指向同一份数据的另一个指针,修改a2,会直接导致a1的变化。
ES5只能用变通方法来复制数组。
consta1=[1,2] consta2=a1.concat() a2[0]=2 a1//[1,2]
ES6写法
consta1=[1,2] //写法1 consta2=[...a1] //写法2 const[...a2]=a1
2)合并数组
扩展运算符提供了数组合并的新写法。
constarr1=['a','b'] constarr2=['c'] constarr3=['d','e'] //ES5的合并数组 arr1.concat(arr2,arr3) //ES6的合并数组 [...arr1,...arr2,...arr3]
不过,这两种方法都是浅拷贝,使用的时候需要注意。
consta1=[{foo:1}] consta2=[{bar:2}] consta3=a1.concat(a2) consta4=[...a1,...a2] a3[0]===a1[0]//true a4[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//1 rest//[2,3,4,5] const[first,...rest]=[] first//undefined rest//[]
如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。
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接口的类似数组的对象,扩展运算符就无法将其转为真正的数组。
letarrayLike={ '0':'a', '1':'b', length:2 } //TypeError:Cannotspreadnon-iterableobject. letarr=[...arrayLike];
上面代码中,arrayLike是一个类似数组的对象,但是没有部署Iterator接口,扩展运算符就会报错。这时,可以改为使用Array.from方法将arrayLike转为真正的数组。
扩展运算符内部调用的是数据结构的Iterator接口,因此只要具有Iterator接口的对象,都可以使用扩展运算符,比如Map结构。
letmap=newMap([ [1,'one'], [2,'two'], [3,'three'], ]); letarr=[...map.keys()];//[1,2,3]
感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。
更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。