Array
扩展运算符
- 能够正确识别四个字节的 Unicode 字符
[..."x\uD83D\uDE80y"].length; // 3
- 任何定义了遍历器(Iterator)接口的对象,都可以用扩展运算符转为真正的数组
Array.from()
Array.from()方法用于将两类对象转为真正的数组:
- 类似数组的对象(array-like object),即任何有 length 属性的对象。此时扩展运算符就无法转换
- 可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)
Array.of()
Array.of()方法用于将一组值,转换为数组
Array.of(3, 11, 8); // [3,11,8]
Array.of(3); // [3]
Array.of(); // []
这个方法的主要目的,是弥补数组构造函数 Array()的不足。因为参数个数的不同,会导致 Array()的行为有差异。
实例方法:copyWithin()
在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。也就是说,使用这个方法,会修改当前数组
Array.prototype.copyWithin(target, (start = 0), (end = this.length));
实例方法:find() 和 findIndex(),findLast() 和 findLastIndex()
都可以发现 NaN,弥补了数组的 indexOf() 方法的不足
实例方法:fill()
new Array(3).fill(7);
注意,如果填充的类型为对象,那么被赋值的是同一个内存地址的对象,而不是深拷贝对象。
实例方法: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()
Array.prototype.includes 方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的 includes 方法类似
indexOf 方法有两个缺点,一是不够语义化,它的含义是找到参数值的第一个出现位置,所以要去比较是否不等于-1,表达起来不够直观。二是,它内部使用严格相等运算符(===)进行判断,这会导致对 NaN 的误判
[NaN].indexOf(NaN); // -1
[NaN].includes(NaN); // true
实例方法:flat(),flatMap()
Array.prototype.flat() 用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响
[1, 2, [3, 4]].flat(); // [1, 2, 3, 4]
[1, 2, [3, 4, [5, 6]]].flat(); // [1, 2, 3, 4, [5, 6]]
[1, 2, [3, 4, [5, 6]]].flat(2); // [1, 2, 3, 4, 5, 6]
// 如果不管有多少层嵌套,都要转成一维数组,可以用 Infinity 关键字作为参数
[1, [2, [3]]].flat(Infinity); // [1, 2, 3]
flatMap() 方法对原数组的每个成员执行一个函数(相当于执行 Array.prototype.map()),然后对返回值组成的数组执行 flat() 方法。该方法返回一个新数组,不改变原数组
flatMap()只能展开一层数组
实例方法:at()
at()方法,接受一个整数作为参数,返回对应位置的成员,并支持负索引
不仅可用于数组,也可用于字符串和类型数组(TypedArray)
实例方法:toReversed(),toSorted(),toSpliced(),with()
这四个新方法对应的原有方法,含义和用法完全一样,唯一不同的是不会改变原数组,而是返回原数组操作后的拷贝
- toReversed() 对应 reverse(),用来颠倒数组成员的位置。
- toSorted() 对应 sort(),用来对数组成员排序。
- toSpliced() 对应 splice(),用来在指定位置,删除指定数量的成员,并插入新成员。
- with(index, value) 对应 splice(index, 1, value),用来将指定位置的成员替换为新的值。
实例方法:group(),groupToMap()
group()的参数是一个分组函数,原数组的每个成员都会依次执行这个函数,确定自己是哪一个组
const array = [1, 2, 3, 4, 5];
array.group((num, index, array) => {
return num % 2 === 0 ? "even" : "odd";
});
// { odd: [1, 3, 5], even: [2, 4] }
[6.1, 4.2, 6.3].group(Math.floor);
// { '4': [4.2], '6': [6.1, 6.3] }
groupToMap()的作用和用法与 group()完全一致,唯一的区别是返回值是一个 Map 结构,而不是对象。Map 结构的键名可以是各种值,所以不管分组函数返回什么值,都会直接作为组名(Map 结构的键名),不会强制转为字符串。这对于分组函数返回值是对象的情况,尤其有用