ES6数组扩展

Posted mijiujs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES6数组扩展相关的知识,希望对你有一定的参考价值。

扩展运算符

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

运用

1.替代函数的apply方法

function f(x,y,z){}
let args=[1,2,3]
f.apply(null,args)

f(...args)
Math.max(...args)
arr.push(...arr2)

2.复制数组

const arr2=[...arr1] //方法1
const [...arr2]=arr1

3.合并数组

arr1.concat(arr2,arr3)
[...arr1,...arr2,...arr3]

4.与解构赋值

const [first, ...rest] = [];
first // undefined
rest  // []

const [first, ...rest] = ["foo"];
first  // "foo"
rest   // []

5.将有Iterator接口的对象转换为数组 

如字符串

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

如map,set(去重)

let map = new Map([
  [1, ‘one‘],
  [2, ‘two‘],
  [3, ‘three‘],
]);

let arr = [...map.keys()]; // [1, 2, 3]

 

Array.from() 

将类数组对象和可比案例对象转换为数组

let arrayLike = {
    ‘0‘: ‘a‘,
    ‘1‘: ‘b‘,
    ‘2‘: ‘c‘,
    length: 3
};

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

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

扩展运算符(...)也可以将某些数据结构转为数组。

Array.from还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。

Array.from(arrayLike, x => x * x);
// 等同于
Array.from(arrayLike).map(x => x * x); 

Array.of()

用于将一组值,转换为数组,主要目的是弥补构造函数Array()的不足

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

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

Array.of方法可以用下面的代码模拟实现。

function ArrayOf(){
  return [].slice.call(arguments);
}

实例方法copyWithin() 

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

Array.prototype.copyWithin(target, start = 0, end = this.length)
  • target(必需):从该位置开始替换数据。如果为负值,表示倒数。
  • start(可选):从该位置开始读取数据,默认为 0。如果为负值,表示从末尾开始计算。
  • end(可选):到该位置停止读取数据,默认等于数组长度。如果为负值,表示从末尾开始计算。
[1, 2, 3, 4, 5].copyWithin(0, 3)
// [4, 5, 3, 4, 5]

实例方法 find() 和 findIndex()

找到第一个符合条件的成员

find()成功返回该成员,否则返回undefined

findIndex成功放回该成员位置,否则返回-1

实例方法fill()

使用给定值,填充一个数组。第一个参数为填充值,第二个参数和第二个参数用于指定填充的起始位置和结束位置(结束为止不包括

[‘a‘, ‘b‘, ‘c‘].fill(7)
// [7, 7, 7]
[‘a‘, ‘b‘, ‘c‘].fill(7, 1, 2)
// [‘a‘, 7, ‘c‘]
//2号位之前结束

注意,如果填充的类型为对象,那么被赋值的是同一个内存地址的对象,而不是深拷贝对象

let arr = new Array(3).fill({name: "Mike"});
arr[0].name = "Ben";
arr
// [{name: "Ben"}, {name: "Ben"}, {name: "Ben"}]

let arr = new Array(3).fill([]);
arr[0].push(5);
arr
// [[5], [5], [5]] 

实例方法entries(),keys() 和 values()

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()

第一个参数为要查找的值,第二个为其实位置

成功返回true,否则返回false

实例方法flat(),flatMap()

拉平数组,返回新数组

[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]] 无参数默认参数为1

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

[1, [2, [3]]].flat(Infinity)
// [1, 2, 3] 不管多少层嵌套拉平用Infinity

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

flatMap()方法对原数组的每个成员执行一个函数(相当于执行Array.prototype.map()),然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组。flatMap()只能展开一层数组

// 相当于 [[[2]], [[4]], [[6]], [[8]]].flat()
[1, 2, 3, 4].flatMap(x => [[x * 2]])
// [[2], [4], [6], [8]]

数组的空位

指数组的某一个位置没有任何值

Array(3) // [, , ,]

注意,空位不是undefined,一个位置的值等于undefined代表依然有值。空位是没有任何值。

  • forEach()filter()reduce()every() 和some()都会跳过空位。
  • map()会跳过空位,但会保留这个值
  • join()toString()会将空位视为undefined,而undefinednull会被处理成空字符串

ES6 则是明确将空位转为undefined

Array.from()将空位转为undefined

扩展运算法将空位转为undefined

copyWithin()会连空位一起拷贝。

fill()会将空位视为正常的数组位置。

for...of循环也会遍历空位。

entries()keys()values()find()findIndex()会将空位处理成undefined

Array.prototype.sort() 的排序稳定性

排序稳定性(stable sorting)是排序算法的重要属性,指的是排序关键字相同的项目,排序前后的顺序不变。

  

以上是关于ES6数组扩展的主要内容,如果未能解决你的问题,请参考以下文章

ES6数组扩展运算符和字符串遍历的新方法!!!

javascript es6 数组功能 [...data, 0] “扩展运算符”

es6扩展运算符 (...)

es6+最佳入门实践

ES6数组扩展

ES6数组扩展