ES6之数组的扩展

tip:在工作也有用到ES6的一些简单语法,但没有太系统的太细节的去了解实践过。所以最近主动营业啃起了阮老师的ES6标准入门,进一步学习。

1.Array.from()

用途:将类似数组的对象和可遍历的对象(包括ES6新增的数据结构Set和Map)转成真正的数组。

类似数组事例:

let arrLike = {
'0': 'a',
'1': 'b',
length: 2 // 一定要标注length, ES5中如果length大于数组长度超出的部分会返回empty,ES6中则会返回undefine
}
// ES5写法
var arr1 = [].slice.call(arrLike) // ['a', 'b']
// ES6写法
var arr2 = Array.from(arrLike) // ['a', 'b']

*所谓类似数组的对象,本质特征只有一点,即必须有length属性。所以,任何有length属性的对象,都可以使用Array.from方法。而下面这种情况扩展运算符无法转换

  Array.from({length: 2}) // [undefine, undefine]

对于没有支持ES6语法的浏览器可以使用Array.prototype.slice方法替代

 const toArray = (() => {
        Array.from ? Array.from : obj => [].slice.call(obj)
    })

可遍历的对象:

var arr5 = Array.from('hello') //  ["h", "e", "l", "l", "o"]
    let namesSet = new Set(['a', 'b'])
    Array.from(namesSet) //["a", "b"]

因为字符串和Set结构都具有Iterator接口,因此可以被Array.from方法转成真正的数组。如果是一个真正的数组Array.from方法会返回 一个一模一样的新数组 

 

此外,Array.from方法还支持第二参数,作用类似于数组的map方法,用来对每个元素进行处理

  let arrLike = {
      '0': '1',
      '1': '2',
      length: 2 
  }
 var arr3 = Array.from(arrLike, x => x * x)  //  [1, 4]
 var arr4 = Array.from(arrLike).map(x => x * x) //  [1, 4]

Array.from()的另一个应用就是把字符串转成数组,然后返回字符串长度。好处是此方法可以正确处理各种Unicode字符,可以避免JavaScript大于\uFFFF的字符的bug.

2.Array.of()

用途:将一组值起换为数组

Array.of(1,2,3) // [1, 2, 3]
Array.of(3) // [3]
Array.of(1,2,3).length // 3

此方法主要是用来弥补Array()的不足,因为参数不同会导致Array()的行为差异

Array() // []
Array(3) // [empty × 3]
Array(1,2,3) // [1, 2, 3]

此处小结:Array方法中参数>=2时返回新数组,参数<2时指定数组长度,而Array.of方法总是返回参数值组成的数组,如果没有参数,就返回一个空数组。

3.数组实例的copyWithin()

用途:在当前数组内部指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。也就是说,使用这个方法会修改当前数组。

Array.prototype.copyWithin(target, start = 0 ,end = this.length )

它接受3个参数:

target(必须):从该位置开始替换数据

start(可选):从该位置开始读取数组,默认从0开始,如果是负值,则倒数

end(可选):到该位置前停止读取数据,默认从this.length开始,如果是负值,则倒数

[1,2,3,4,5].copyWithin(0,2) // [3,4,5,4,5]
[1,2,3,4,5].copyWithin(0,2,4) // [3,4,3,4,5]

4.数组实例的find()与findIndex()

find用途:找符合要求的第一个数组成员 。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找到第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefine.

findInde用途:与find相似,返回第一个符合条件的数组成员的位置。如果所有成员都不符合条件则返回-1.

find方法:
[1,2,3,4,5].find(function (value, index, arr) { return value > 3 }) // 4
findInde方法:
[1,2,3,4,5].findIndex(function (value, index, arr) {

  return value > 3
}) // 3

两个方法的回调函数可接受3个参数,依次是当前的值,当前位置,原数组。另外他们都可以接受第二个参数用来绑定回调函数的this对象。且他们都可以发现NaN,弥补了IndexOf方法的不足。

[NaN].indexOf(NaN) // -1
[NaN].findIndex(y => Object.is(NaN, y)) // 0

上述代码,indexOf方法无法识别数组的NaN成员,但是findIndex方法可以借助Obje.is方法做到。

5.数组实例的fill()

用途:填充数组

[1,2,3].fill(5) // [5, 5, 5]
new Array(3).fill(5) // [5, 5, 5]

另外,fill方法还接受第二个和第三个参数,用于指定填充的起始位置和结束位置

[1,2,3].fill(5,0,1) // [5, 2, 3]

6.数组实例的entries(),keys(),values()

entries用途:键值遍历数组,返回一个遍历器对象

keys用途:键名遍历数组,返回一个遍历器对象

values用途:键对遍历数组,返回一个遍历器对象

7.数组实例的includes()

用途:返回一个布尔值,表示某个数组是否包含给定值,与字符串的includes方法类似 ,该方法的第二个参数表示搜索的起始位置,默认为0,如果有负数,则表示倒数位置,如果超出数组长度则从0开始。

 

查阅资料:ES6标准入门(第2版)阮一峰著

posted @ 2020-03-07 16:07  lee是美少女  阅读(227)  评论(0编辑  收藏  举报