ES6新特性七:数组的扩充详解
本文实例讲述了ES6新特性之数组的扩充。分享给大家供大家参考,具体如下:
1.Array.from()
1)Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-likeobject)和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map,他们都部署了iterator接口,字符串也是)。
letarrayLike={ '0':'a', '1':'b', '2':'c', length:3 }; //ES5的写法 vararr1=[].slice.call(arrayLike); console.log(arr1)//['a','b','c'] //ES6的写法 letarr2=Array.from(arrayLike); console.log(arr2)//['a','b','c'] Array.from('hello')//['h','e','l','l','o'] letnamesSet=newSet(['a','b']) Array.from(namesSet)//['a','b']
2)扩展运算符(...)背后调用的是遍历器接口(Symbol.iterator),如果一个对象没有部署这个接口,就无法转换。Array.from方法则是还支持类似数组的对象。所谓类似数组的对象,本质特征只有一点,即必须有length属性。
Array.from({length:3});//扩展运算符就转换不了 //[undefined,undefined,undefined]
3)Array.from还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。
vara=Array.from([1,2,3],x=>x*x); console.log(a) //等同于 vara1=Array.from([1,2,3]).map(x=>x*x); console.log(a1) vara2=Array.from([1,2,3],(x)=>x*x) console.log(a2)//[1,4,9] //只要有一个原始的数据结构,你就可以先对它的值进行处理, //然后转成规范的数组结构,进而就可以使用数量众多的数组方法。 vara3=Array.from({length:2},()=>'jack') console.log(a3)//['jack','jack']
2.Array.of()
返回参数值组成的数组。如果没有参数,就返回一个空数组,弥补数组构造函数Array()的不足。因为参数个数的不同,会导致Array()的行为有差异。
console.log(Array())//[] console.log(Array(3))//[,,,] console.log(Array(3,11,8))//[3,11,8] console.log(Array.of(3,11,8))//[3,11,8] console.log(Array.of(3))//[3] console.log(Array.of())//[]
3.数组实例的find()和findIndex()
①数组实例的find方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined
vara=[1,4,-5,10].find((n)=>n<0) console.log(a) //find方法的回调函数可以接受三个参数,依次为当前的值、当前的位置和原数组。 [1,5,10,15].find(function(value,index,arr){ returnvalue>9; })//10
②数组实例的findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。
[1,5,10,15].findIndex(function(value,index,arr){ returnvalue>9; })//2
4.数组实例的fill()
fill方法使用给定值,填充一个数组。数组中已有的元素,会被全部抹去。
['a','b','c'].fill(7)//[7,7,7] newArray(3).fill(7)//[7,7,7]
fill方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置(包左不包右)。
['a','b','c'].fill(7,1,2) //['a',7,'c']
5.数组实例的entries()、keys()和values()
ES6提供三个新的方法——entries(),keys()和values()——用于遍历数组。它们都返回一个遍历器对象.for...of会自动的调用遍历器的next().
for(letindexof['a','b'].keys()){ console.log(index); } //0 //1 for(letelemof['a','b'].values()){ console.log(elem); } //'a' //'b' for(let[index,elem]of['a','b'].entries()){ console.log(index,elem); } //0"a" //1"b"
如果不使用for...of循环,可以手动调用遍历器对象的next方法,进行遍历。
letletter=['a','b','c']; letentries=letter.entries(); console.log(entries.next().value);//[0,'a'] console.log(entries.next().value);//[1,'b'] console.log(entries.next().value);//[2,'c']
6.数组实例的includes()
Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值。该方法的第二个参数表示搜索的起始位置,默认为0。如果第二个参数为负数,则表示倒数的位置。
[1,2,3].includes(2);//true [1,2,3].includes(4);//false [1,2,NaN].includes(NaN);//true
另外,Map和Set数据结构有一个has方法,需要注意与includes区分。
Map结构的has方法,是用来查找键名的:
比如Map.prototype.has(key)、WeakMap.prototype.has(key)、Reflect.has(target,propertyKey)。
Set结构的has方法,是用来查找值的:
比如Set.prototype.has(value)、WeakSet.prototype.has(value)。
7.数组的空位
数组的空位指,数组的某一个位置没有任何值。空位不是undefined,一个位置的值等于undefined,依然是有值的。
Array(3)//[,,,]
ES6则是明确将空位转为undefined。
console.log(Array.from(['a',,'b']))//['a',undefined,'b'] console.log([...['a',,'b']])//["a",undefined,"b"] letarr=[,'a',,]; for(letiofarr){ console.log(i); }//undefinedaundefined
//entries() [...[,'a'].entries()]//[[0,undefined],[1,"a"]] //keys() [...[,'a'].keys()]//[0,1] //values() [...[,'a'].values()]//[undefined,"a"] //find() [,'a'].find(x=>true)//undefined //findIndex() [,'a'].findIndex(x=>true)//0
希望本文所述对大家ECMAScript程序设计有所帮助。