ES6数组新增方法详解:find、flat、at、from及扩展运算符
本文详细解析ES6中数组新增的核心方法。涵盖find与findIndex用于查找元素及其索引;flat用于扁平化嵌套数组;at支持负索引访问;from将类数组转为真数组;of用于数值转数组;includes判断包含关系。同时介绍扩展运算符及空位处理机制,帮助开发者高效操作数组。
在ES6标准引入之前,开发者主要通过两种途径来构建数组实例。
第一种方式是利用数组字面量语法直接定义。
let array = [1,2,3];
console.log(array);//[1,2,3]第二种方式是通过调用Array构造函数来实例化数组。
let array = new Array(1, 2, 3);
console.log(array); //[1,2,3]Array.find((item,indexArr,arr)=>{}) 掌握
该方法旨在定位数组中首个满足特定测试条件的成员。
其接收一个回调函数作为参数,该函数会依次对数组中的每个成员执行。
一旦回调函数返回true,find方法即停止遍历并返回该成员。
若遍历结束后未找到符合条件的成员,则返回undefined。
-- 找出第一个大于15的数字
let arr = [10, 20, 30]
let firstItem = arr.find((item, index, Arr) => {
return item > 15
})
console.log('firstItem==>', firstItem); //输出20
-- 找出第一个大于19的数字的这一项的值
let arr = [{
age: 10
}, {
age: 20
}, {
age: 30
}]
let firstItem = arr.find((item, index, Arr) => {
return item.age > 19
})
console.log('firstItem==>', firstItem); //输出{age: 20}Array.findIndex((item, index, Arr) => {}) 掌握
findIndex方法的逻辑与find高度相似,但返回值的含义不同。
它返回首个符合条件成员的索引位置;若全都不符合,则返回-1。
let arr = [{
age: 10
}, {
age: 20
}, {
age: 30
}]
let a = arr.findIndex((item, index, Arr) => {
return item.age > 15
})
let b = arr.findIndex((item, index, Arr) => {
return item.age > 45
})
console.log('a==>', a); //输出1
console.log('b==>', b); //输出-1
//查找数组的某一项是否有某个值
//返回第一个符合条件的数组成员的位置
const arr = [{
id: 001
}, {
id: 002
}, {
id: 003
}];
let index = arr.findIndex(item => {
return item.id == '004'
})
console.log(index);Array.flat()用于拉平嵌套的数组[推荐-超级好用]
当数组元素本身也是数组时,flat方法可将嵌套结构展平为一维数组。
该方法返回一个新数组,对原数据没有影响。
[1, 2, [3, 4]].flat() 读音【fu la t】
flat()默认只会“拉平”一层,如果想要“拉平”多层的嵌套数组。
可以将flat()方法的参数写成一个整数,表示想要拉平的层数,默认为1。
[1, 2, [3, [4, 5]]].flat()
上面代码中,表示想要拉平的层数,默认为1
// [1, 2, 3, [4, 5]]
[1, 2, [3, [4, 5]]].flat(2)
上面代码中,flat()的参数为2,表示要“拉平”两层的嵌套数组。
// [1, 2, 3, 4, 5]
如果不管有多少层嵌套,都要转成一维数组,可以用Infinity关键字作为参数。
[1, [2, [3]]].flat(Infinity)
// [1, 2, 3]
如果原数组有空位,flat()方法会跳过空位。
[1, 2, , 4, 5].flat()
// [1, 2, 4, 5]Array.at()返回对应下标的值[超级好用]
传统JavaScript语法不支持使用负数作为数组索引。
若要获取最后一个元素,此前只能使用arr[arr.length - 1]这种写法。
为解决负索引访问难题,ES6在数组原型上增加了at()方法,接收整数参数。
该方法返回指定位置的成员,并原生支持负索引访问。
此方法不仅适用于数组,同样适用于字符串和TypedArray类型数组。
若提供的参数超出数组有效范围,at()将返回undefined。
const arr = [100, 120, 18, 130, 4];
console.log(arr.at(1)) //120
console.log(arr.at(-1)) //4
console.log(arr.at(-5)) //100
console.log(arr.at(-6)) //undefinedArray.from() [掌握]
该方法可将一个类似数组的对象或可迭代对象转换为真正的数组。
关键前提是该类似数组对象必须拥有length属性,否则无法正确转换。
若缺乏length属性,转换结果将是一个空数组。
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']
当没有类似数组的对象没有length属性
let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
};
//此时返回的是一个空数组
let arr2 = Array.from(arrayLike); // []Array.of() 了解
Array.of()方法的主要功能是将一组数值参数转换为数组实例。
基础使用示例如下。
const a = Array.of(10, 20, 26, 38);
console.log(a); // [10, 20, 26, 38]
const b = Array.of(1).length;
console.log(b); // 1
Array.of()可以用以下的代码模拟实现:
function ArrayOf() {
return [].slice.call(arguments);
}Array.includes的使用
Array.prototype.includes方法返回布尔值,指示数组是否包含指定值。
其用法与字符串的includes方法类似,该方法于ES2016标准中引入。
基础使用示例如下。
const arr = [100, 200, 300];
console.log(arr.includes('100')) //false
console.log(arr.includes(100)) //true在此方法出现前,开发者通常利用indexOf检查值是否存在。
if (arr.indexOf(el) !== -1) {
// 有这个值
}
indexOf方法有两个缺点,一是不够语义化,它的含义是找到参数值的第一个出现位置,
所以要去比较是否不等于-1,表达起来不够直观。
二是,它内部使用严格相等运算符(===)进行判断,这会导致对NaN的误判。
[NaN].indexOf(NaN) // -1
includes使用的是不一样的判断算法,所以没有这个问题。
[NaN].includes(NaN)
// true扩展运算符 (...)
扩展运算符由三个点号(...)组成。
它的作用是将数组展开,转换为用逗号分隔的参数序列。
console.log(...[1, 2, 3])
// 1 2 3
console.log(1, ...[2, 3, 4], 5)
// 1 2 3 4 5
[...document.querySelectorAll('div')]
// [<div>, <div>, <div>]let arr1=[11,22,];
let arr2=["aa","bb"];
// es5的合并
let arr=arr1.concat(arr2);
console.log(arr) // [11, 22, "aa", "bb"]
//es6
let newarr=[...arr1,...arr2]
console.log(newarr) // [11, 22, 33, 55, "aa", "bb", "cc", "dd"]// 函数内部有一个对象,arguments可以获取到实参,但是一个伪数组
//Array[饿 rei]
function sun(){
console.log(arguments)
//Arguments(8) [1, 2, 3, 4, 5, 6, 7, 9, callee: ƒ, Symbol(Symbol.iterator): ƒ] 他是一个伪数组
}
sun(1,2,3,4,5,6,7,9);
// 如何将函数内部的伪数组变为真实的数组 方法1
function sun(){
let ags=Array.prototype.slice.call(arguments);
ags.push(150);
console.log(ags); //[1, 2, 3, 4, 5, 6, 7, 9, 150]
}
sun(1,2,3,4,5,6,7,9);
// 如何将函数内部的伪数组变为真实的数组 方法2
function sun(){
let ags=[...arguments];//将伪数组百年未真实的数组
ags.push(150);
console.log(ags); //[1, 2, 3, 4, 5, 6, 7, 9, 150]
}
sun(1,2,3,4,5,6,7,9);
// 总结扩展运算符是... [...变为真实数组的对象]数组的空位
数组空位指数组中某个位置没有任何值存在。
例如,使用Array()构造函数返回的数组通常包含空位。
let arr = new Array(3)
console.log(arr); // [, , ,] 谷歌浏览器中会有出现 [空属性 × 3]上述代码中,Array(3)返回一个包含3个空位的数组。
forEach(), filter(), reduce(), every() 和some()都会跳过空位。
map()会跳过空位,但会保留这个值
join()和toString()会将空位视为undefined,而undefined和null会被处理成空字符串。
ps:ES6 则是明确将空位转为undefined。
let arr = new Array(3)
console.log(arr[0] === undefined); //trueES5标准对空位的处理存在不一致性,多数情况下会忽略这些空位。
ps:ES6 则是明确将空位转为undefined。
Array.from()方法会将数组的空位,转为undefined,也就是说,这个方法不会忽略空位。
Array.from(['a',,'b'])
// [ "a", undefined, "b" ]
扩展运算符(...)也会将空位转为undefined。
[...['a',,'b']]
// [ "a", undefined, "b" ]
new Array(3).fill('a') // ["a","a","a"]
for...of循环也会遍历空位。
let arr = [, ,];
for (let i of arr) {
console.log(1);
}
// 1
// 1
上面代码中,数组arr有两个空位,for...of并没有忽略它们。
如果改成map()方法遍历,空位是会跳过的总结
至此,关于ES6中数组新增方法的介绍已完成。如需了解更多ES6数组相关技巧,欢迎查阅本站往期文章或继续阅读后续内容,感谢大家的支持!
JavaScript异步发送HTTP请求时怎么优雅地处理错误
2026-11-05 17:10:44
5款主流JS在线运行工具对比:CodePen、JSFiddle与StackBlitz怎么选
2026-11-05 17:04:04
JavaScript入门书籍避坑:这些书不适合初学者
2026-11-05 16:31:15
JS使用Math.round实现保留两位小数的原理与代码
2026-11-05 15:35:55
JavaScript 原生 Date 对象怎么实现日期加减
2026-11-05 14:30:00
