es6学习:数组的扩展

1、扩展运算符:…
将一个数组转为用逗号分隔的参数序列。

console.log(...[1, 2, 3])
// 1 2 3

该方法在函数中有较大作用:

const numbers = [4, 38];
add(...numbers)    //将数组转化为参数序列

赋值数组:
由于扩展运算符不会改变原数组,所以可以用它来赋值数组:

const a1 = [1, 2];
// 写法一
const a2 = [...a1];
// 写法二
const [...a2] = a1;

合并数组:
由于…的特性,扩展运算符还可以用来合并数组:

const arr1 = ['a', 'b'];
const arr2 = ['c'];
const arr3 = ['d', 'e'];

// ES5 的合并数组
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]

// ES6 的合并数组
[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]

但是这两种方法都是浅拷贝,即它们的成员都是对原数组成员的引用,原数组若改动,新数组会一起改变。

扩展运算符可以与解构赋值结合起来,用于生成数组:

const [first, ...rest] = [1, 2, 3, 4, 5];
first // 1
rest  // [2, 3, 4, 5]

很显然,…只能放在参数的最后一位,否则会报错。

扩展运算符还可以将字符串转为真正的数组:

[...'hello']
// [ "h", "e", "l", "l", "o" ]

也可以将类数组转化为真正的数组:

let nodeList = document.querySelectorAll('div');
let array = [...nodeList];

es6也提供了专门的方法来将类似数组的对象转化为数组:
Array.from():

let arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3      //必须要有length属性
};

// ES5的写法
var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']

// ES6的写法
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']

此时扩展运算符就无效了。因此实现转化记住Array.from就行了。

扩展运算符背后调用的是遍历器接口(Symbol.iterator),如果一个对象没有部署这个接口,就无法转换。

Array.of():
Array.of方法用于将一组值,转换为数组,如果没有参数,就返回一个空数组。

Array.of()         //[]
Array.of(3, 11, 8) // [3,11,8]

其实直接使用Array()传入参数就可以转化为数组,但这样会有一些问题,即只有当参数个数不少于 2 个时,Array()才会返回由参数组成的新数组。参数个数只有一个时,实际上是指定数组的长度。

Array() // []
Array(3) // [, , ,]
Array(3, 11, 8) // [3, 11, 8]

可以看到此方法有很大的缺点。

fill():
fill方法使用给定值,填充一个数组。

['a', 'b', 'c'].fill(7, 1, 2)
// ['a', 7, 'c']

参数1表示要填入的值,参数二表示从第几位开始填,3表示在第几位之前结束。若只有一个参数则全部替换掉。

遍历数组的方法:
ES6 提供三个新的方法——entries(),keys()和values()——用于遍历数组。
keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。

for (let index of ['a', 'b'].keys()) {
  console.log(index);       //键名的遍历
}
// 0
// 1

for (let elem of ['a', 'b'].values()) {
  console.log(elem);       //键值的遍历
}
// 'a'
// 'b'

for (let [index, elem] of ['a', 'b'].entries()) {
  console.log(index, elem);       //键值对的遍历
}
// 0 "a"
// 1 "b"

includes()
与字符串的includes()类似,数组也有这个方法,表示某个数组是否包含给定的值

[1, 2, 3].includes(3, 3);  // false
[1, 2, 3].includes(3, -1); // true

第二个参数表示搜索的起始位置,为正数且超出长度则false,为负数且超出长度则重置,从零开始

flat()
flat用于将嵌套数组转化为一维的

[1, 2, [3, [4, 5]]].flat()   //默认拉平一层
// [1, 2, 3, [4, 5]]

[1, 2, [3, [4, 5]]].flat(2)   //参数决定拉平几层
// [1, 2, 3, 4, 5]

[1, 2, , 4, 5].flat()        //自动跳过空位
// [1, 2, 4, 5]

[1, [2, [3]]].flat(Infinity)   //参数使用Infinity关键字
                                //即可将所有的层数拉平
// [1, 2, 3]

flatMap
对原数组的每个成员执行一个函数,然后对返回值组成的数组执行flat()方法返回一个新数组

[2, 3, 4].flatMap((x) => [x, x * 2])
// [2, 4, 3, 6, 4, 8]

但该方法只能展开一层

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值