Es6新增的一些数组API

1.Array.of()

Array.of基本上可以用来替代Array()或new Array(),并且不存在由于参数不同而导致的重载!因为Array方法没有参数、一个参数、二个参数时,返回结果都不一样。只有当参数个数不少于 2 个时,Array()才会返回由参数组成的新数组。参数个数只有一个时,实际上是指定数组的长度!而Array.of总是返回参数值组成的数组。如果没有参数,就返回一个空数组。

Array()//[]
Array(5)//[empty × 5]
Array(1,5)//[1, 5]

Array.of()//[]
Array.of(5)//[5]
Array.of(1,5)//[1, 5]
2. 数组实例的fill()
  1. fill方法可以接三个参数,有一个参数时为给定值,填充一个数组!
[1,2,3].fill(9)//[9, 9, 9]
new Array(3).fill(9)//[9, 9, 9]
  1. 有二个参数的时候,第一个参数是给定的填充的值,第二个参数是填充的起始位置!
[1,2,3].fill(9,1)//[1, 9, 9]
new Array(3).fill(9,1))//[empty, 9, 9]
  1. 有三个参数的时候,第一个参数是给定的填充的值,第二个参数是填充的起始位置,第三个参数是填充结束位置!
[1,2,3,4,5,6].fill(9,1,4)//[1, 9, 9, 9, 5, 6]

注意:上面代码表示,fill方法从 1 号置位开始,向原数组填充 9,到 4 号位置之前结束(不包括4号位置)!

3.扩展运算符
  1. 扩展运算符(spread)是三个点(…),将一个数组转为用逗号分隔的参数序列!
(...[1,2,3,4,5])//1 2 3 4 5

let add = (x, y) => {
    console.log(x + y);
};
add(...[1, 2])//3  
  1. 扩展运算符都放在圆括号里面,扩展运算符所在的括号要是是函数调用才不会报错,它还可以替代函数的 apply 方法!
let arr1 = [1, 2, 3];
Array.prototype.push.apply(arr1, [4, 5, 6]);//Es5写法 [1, 2, 3, 4, 5, 6]
console.log(arr1);
arr1.push(...[7,8,9]);//Es6写法  
console.log(arr1);//[1, 2, 3, 4, 5, 6, 7, 8, 9]
  1. 扩展运算符可以复制数组,它和slice,concat类似,只是一个浅拷贝!
let arr1 = [
    [1, 1], 2, 3
];
arr2 = [...arr1];
arr2[0][0] = 2;
console.log(arr1, arr2);//[[2, 1], 2, 3]  [[2, 1], 2, 3] 
  1. 扩展运算符还可以合并数组!
let arr1 = [1, 2, 3];
console.log([...arr1,1]);//[1, 2, 3, 1]
console.log([...arr1,...[4,5,6]]);//[1, 2, 3, 4, 5, 6]
  1. 扩展运算符可以与解构赋值结合起来,可以生成数组!如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。
let arr1 = [start, ...end] = [1, 2, 3, 4, 5, 6];
console.log(start, end);//1  [2, 3, 4, 5, 6]

let arr2 = [...start, end] = [1, 2, 3, 4, 5, 6];
console.log(start, end);// Uncaught SyntaxError: Rest element must be last element
4.Array.from()
  1. Array.from方法用于将两类对象转为真正的数组,一:伪数组的对象(类似dom元素,arguments对象),二:可遍历的对象(包括 ES6 新增的数据结构 Set 和 Map)
let a = {
    0: 1,
    1: 2,
    2: 3,
    length: 3
}
let div = document.querySelectorAll('div');
console.log(Array.from(a));//[1,2,3]
console.log(Array.from(div))
console.log(Array.from(new Set([1,2,3,4])))//[1,2,3,4]
  1. Array.from还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组
Array.from([1, 2, 3], (item) => item * item)  // [1,4,9]
  1. 如果map函数里面用到了this关键字,还可以传入Array.from的第三个参数,用来绑定this。
Array.from([1, 2, 3], function (x) {
   return x * this.y;
}, {
   x: 1,
   y: 2
})//[2, 4, 6]
5.数组实例的 flat()

此方法可以将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响!flat()的参数为几,表示要“拉平”几层的嵌套数组,如果不管有多少层嵌套,都要转成一维数组,可以用Infinity关键字作为参数。

 [1, 2, 3, [4, 5]].flat();//[1, 2, 3, 4, 5]
 [1, 2, 3, [[3,4], 5]].flat(2);// [1, 2, 3, 3, 4, 5]
 [1, 2, 3, [[3,4], [5,[7,8]]]].flat(Infinity);//[1, 2, 3, 3, 4, 5, 7, 8]
6.数组实例的flatMap()
  1. flatMap()对原数组的每个成员执行一个函数(相当于执行Array.prototype.map()),然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组。
[1,2,3].flatMap((x)=>[x*1,x*2]) //[1, 2, 2, 4, 3, 6]
  1. flatMap()只能展开一层数组。
[1,2,3].flatMap((x)=>[[x*1,x*2]]) //[[1,2],[2,4],[3,6]]
  1. flatMap()方法的第一个参数是一个遍历函数,该函数可以接受三个参数,分别是当前数组成员、当前数组成员的位置(从零开始)、原数组,第二个参数,用来绑定遍历函数里面的this。
let arr = [1, 2, 3, 4, 5].flatMap((function (item, index, arr) {
    return [[item * this.y]];
}), {
    x: 1,
    y: 2
});
console.log(arr);// [[2],[4],[6],[8],[10]]
7.数组实例的 copyWithin()

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

Array.prototype.copyWithin(target, start, end)

它接受三个参数

  1. target(必需):从该位置开始替换数据。如果为负值,表示倒数。
  2. start(可选):从该位置开始读取数据,默认为 0。如果为负值,表示从末尾开始计算。
  3. end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示从末尾开始计算。
//取索引为2到数组结束的值(3,4,5),放到索引为0的位置
[1, 2, 3, 4, 5].copyWithin(0, 2)//[3, 4, 5, 4, 5]
//-1为数组的length-1位置(5),-3就是3,那么就是3,4放到数组索引为0的位置
[1, 2, 3, 4, 5].copyWithin(0, -3, -1)//[3,4,3,4,5]
8.数组实例的 entries(),keys() 和 values()

entries(),keys()和values()都用于遍历数组。但是它们都返回一个遍历器对象,keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历,并且要调用遍历器对象的next方法,然后取value值(有点繁琐!)

let arr = [1, 2, 3],
    entries = arr.entries();
console.log(entries.next().value);//[0,1]
console.log(entries.next().value);//[1,2]
console.log(entries.next().value);//[2,3]

或者直接用for of,这种方法会简单点

let arr = [1, 2, 3];
for (let item of arr.entries()) {
    console.log(item);
};
//[0,1] [1,2] [2,3]

for (let item of arr.keys()) {
    console.log(item);
};
// 0 1 2
for (let item of arr.values()) {
    console.log(item);
};
//1 2 3

还有 find() 和 findIndex() , includes(可以用来代替indexOf),这些比较常用,也比较简单,我这里就不列举出来了,熟练掌握一些Api对算法也是有一定的帮助!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值