最近整理笔记,发现数组的笔记较为松散,索性将知识整合写出来这篇文章,为了有助于理解,作者将每个api都写了例子有助于理解,希望本篇文章能对你有所帮助。
创建数组的方法
// 构造数组
var a = new Array(); // 空数组
var a = new Array(1, ar, arr) // 实数组
// 数组直接量
var a = []; //空数组
var a = [1, "0", arr]; //实数组
对数组的操作
ES6新语法
Array.of()
Array.of()
方法创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型。
Array.of()
和 Array
构造函数之间的区别在于处理整数参数:Array.of(3)
创建一个具有单个元素 3 的数组,而 Array(3)
创建一个长度为3的空数组
目的:Arrat.of()是为了解决构造数组因参数个数不同,导致的行为差异
var a = new Array(3);
console.log(a); //VM109:2 (3) [空 ×3]
var a = Array.of(3);
console.log(a); // [3]
Array.from()
Array.from()
方法对一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。(不改变原对象返回新的数组)
参数
- (必需):转为数组的对象。
- (可选):作用类似map方法,可以对每个元素进行处理,每个元素会执行该回调函数。
- (可选):执行回调函数this绑定的对象
let arr = [1, 2, 3, 4, 5]
let set = new Set(arr)
console.log(Array.from(set, item => item + 1)) // [ 2,3,4,5,6 ]
改变原数组
splice()
作用 :对数组进行添加或删除操作,然后返回改变的数组
参数
- index:必需,添加或删除项目的位置,可以为负数(从后往前)
- howmany:可选,表示要删除的数量
- item:可选,要添加到数组的新项目
let a = [1, 2, 3, 4, 5]
let item = a.splice(1, 2) //[2,3]
console.log(a); // [1,4,5] 在下标1的位置往后删除两个元素
let item1 = a.splice(-2, 3) //[4,5]
console.log(a); // [1] 在下标倒数第二个的位置也就是元素 4 ,往后删除3个元素
sort
作用 :对数组的元素进行排序,并返回数组
array.sort((a,b)=>a-b) 升序
array.sort((a,b)=>a+b) 降序
pop()
作用 :删除数组中的最后一个元素
let a = [1, 2, 3, 4, 5]
let item = a.pop() //5
console.log(a); // [1,2,3,4]
shift()
作用 :删除数组的第一个元素
let a = [1, 2, 3, 4, 5]
let item = a.shift() //1
console.log(a); // [2,3,4,5]
unshift()
作用 :向数组的开头添加一个或多个元素,并返回新的长度
let a = [1, 2, 3, 4, 5]
let item = a.unshift(0)
console.log(a); // [0,1,2,3,4,5]
push()
作用 :向末尾添加一个或多个元素,并返回新长度
let a = [1, 2, 3, 4]
let item = a.push(5, 6)
console.log(a); // [1,2,3,4,5,6]
reserve()
作用 :颠倒数组中元素的顺序
let a = [1, 2, 3, 4]
a.reverse()
console.log(a); // [4,3,2,1]
copyWithin()
作用 :指定位置的成员复制到其他位置
参数
- target:必需,替换数据的位置
- start:可选,读取数据位置(默认为0)
- end:可选,停止读取数据位置,默认为数组长度
let a = [1, 2, 3, 4, 5, 6]
a.copyWithin(0, 2, 5)
console.log(a); // [3,4,5,4,5,6]
注意
-
读取数据为左闭右开
-
数组长度不变,读取了多少数据就会在替换位置开始替换多少个元素
-
从target位置开始往后替换数据
fill()
作用 :填充数组
参数
- 必需,填充数组的值
- 可选,填充开始的位置(默认为0)
- 可选,填充的结束位置(默认为数组长度)
let a = [1, 6, 8]
a.fill(2)
console.log(a); // [2,2,2]
let a = [1, 6, 8]
a.fill(2, 0, 1)
console.log(a); // [2,6,8]
注意
- 如果数组位置有数据,会被填充的数据替换
- 填充位置为左闭右开
不改变原数组
slice()
作用 :浅拷贝数组
参数
- begin:可选,提取元素的初始位置
- end:可选,提取元素的结束位置
// 简单数据类型为浅拷贝,改变之后互不影响
let a = [1, 6, 8, 9]
let b = a.slice(0, 3) // [1,6,8]
a[0] = 3
console.log(a); // [3,6,8,9]
console.log(b); // [1,6,8]
//复杂数据类型例如对象会改变
let a1 = [{ name: 'Bob', age: 18 }, { name: 'Mary', age: 20 }]
let b1 = a1.slice(1)
a1[1].name = 'Mark'
console.log(a1); // [ { name: 'Bob', age: 18 }, { name: 'Mark', age: 20 } ]
console.log(b1); // [ { name: 'Mark', age: 20 } ]
注意
字符串也有slice方法
var str = 'Hello World'
let str1 = str.slice(1, 7)
console.log(str1); // 'ello W' 空格也占位置
console.log(str); // 'Hello World'
join()
作用 :数组转字符串,将数组中的所有元素通过指定分隔符进行分割放入
参数
str:指定要使用的分隔符,默认使用逗号
let arr = [1, 2, 3, 4, 5]
let str = a.join('')
console.log(str); // '123345'
//拿取数组中的元素再通过指定分割符隔开放入字符串中
let a = [['Bob', '23'], 'str'];
let str1 = a.join(); // "Bob,23,str"
let b = [{ name: 'Bob', age: '23' }, 'str'];
let str2 = b.join(); // "[object Object],str"
//数组元素是数组的时候,会将里面的数组也调用join() / toString() ,如果是对象的话会被转为`[object Object]`字符串
toLocaleString()
作用 :返回一个表示数组元素的字符串。该字符串由数组中的每个元素的 toLocaleString() 返回值经调用join()方法连接组成
var a = new Date();
let b = a.toLocaleString()
console.log(b); // '2022/2/7 上午10:55:44'
console.log(a); // '2022-02-07T02:57:04.573Z'
toString()
作用 :数组转字符串,把数组转为由逗号链接起来的字符串
相比于join() 没有优势,不推荐使用
concat()
作用 :合并数组,并返回一个新的数组
let a = [1, 2, 3];
let b = [4, 5, 6];
//连接两个数组
let newVal=a.concat(b); // [1,2,3,4,5,6]
// 连接三个数组
let c = [7, 8, 9]
let newVal2 = a.concat(b, c); // [1,2,3,4,5,6,7,8,9]
// 添加元素
let newVal3 = a.concat('添加元素',b, c,'再加一个');
// [1,2,3,"添加元素",4,5,6,7,8,9,"再加一个"]
indexOf()
作用 :查找数组是否存在某个元素,返回下标
参数
- searchElement:必需,被查找的元素
- fromIndex:可选,开始查找的位置(不能大于等于数组的长度),接受负值,默认值为0
let a = ['Bob', [2, 3], 4, 4, 24, 7]
console.log(a.indexOf(2)); // -1
console.log(a.indexOf('7')); // -1
console.log(a.indexOf(7)); // 5
console.log(a.indexOf('Bob')); // 0
console.log(a.indexOf([2, 3])); // -1
注意
-
数组的indexOf搜索跟字符串的indexOf不一样,数组的indexOf使用严格相等
===
搜索元素,即数组元素要完全匹配才能搜索成功。 -
indexOf() 不能识别NaN
lastIndexOf()
作用 :查找指定元素在数组中的最后一个位置
参数
-
searchElement:必需,被查找的元素
-
fromIndex:可选,逆向开始查找位置,默认值数组的-1。正值:从该值往前查找(如果大于或等于数组长度则查找整个数组)。 负值:绝对值大于数组长度则返回 -1
let a = ['Bob', [2, 3], 4, 4, 24, 7]
console.log(a.lastIndexOf(2)); // -1
console.log(a.lastIndexOf(4)); //3
console.log(a.lastIndexOf(4, -4)); //2
includes()
作用 :查找数组是否包含某个元素 返回布尔
参数
- searchElement:必需,被查找的元素
- fromIndex:可选,默认值为0,参数表示搜索的起始位置,接受负值。正值超过数组长度,数组不会被搜索,返回false。负值绝对值超过长数组度,重置从0开始搜索
注意
includes是为了弥补indexOf出现的
-
indexOf方法不能识别
NaN
-
indexOf方法检查是否包含某个值不够语义化,需要判断是否不等于
-1
,表达不够直观
let a = ['Bob', [2, 3], NaN, 4, 24, 7]
console.log(a.includes(2)); // false
console.log(a.includes([2, 3])); // false
console.log(a.includes(NaN)); // true
console.log(a.includes(4, -10)); // true
console.log(a.includes(4, -3)); // true
数组的遍历
遍历数组的方法
forEach
作用 :按升序为数组中含有效值的每一项执行一次回调函数
参数
- function:必需,数组中每个元素调用的函数
- currentValue:必需,数组当前元素的值
- index:可选,当前元素的索引值
- arr:可选,数组对象本身
- thisValue:可选,当执行回调函数时this绑定对象的值,默认值为undefined
注意
- forEach无法中途退出循环,只能用return退出本次回调,进行下一次回调
- forEach没有返回值,即使return了一个值
every
作用 :检测数组所有元素是否都符合判断条件
参数
- function:必需,数组中每个元素调用的函数
- currentValue:必需,数组当前元素的值
- index:可选,当前元素的索引值
- arr:可选,数组对象本身
- thisValue:可选,当执行回调函数时this绑定对象的值,默认值为undefined
注意
- 如果数组中检测到有一个元素不满足,则整个表达式返回 false,且剩余的元素不会再进行检测
- 如果所有元素都满足条件,则返回 true
function isBigEnough(a) {
return a >= 10;
// 判断数组中的所有元素是否都大于10 }
}
let result = [12, 5, 8, 130, 44].every(isBigEnough); // false
let result = [12, 54, 18, 130, 44].every(isBigEnough); // true
// 接受箭头函数写法
[12, 5, 8, 130, 44].every(x => x >= 10); // false
[12, 54, 18, 130, 44].every(x => x >= 10); // true
some
作用 :数组中的是否有满足判断条件的元素
参数
- function:必需,数组中每个元素调用的函数
- currentValue:必需,数组当前元素的值
- index:可选,当前元素的索引值
- arr:可选,数组对象本身
- thisValue:可选,当执行回调函数时this绑定对象的值,默认值为undefined
注意
- 如果有一个元素满足条件,则表达式返回true, 剩余的元素不会再执行检测。
- 如果没有满足条件的元素,则返回false。
function isBigEnough(a) {
return a >= 10;
// 判断数组中是否有元素大于10 }
}
let result = [1, 5, 8].some(isBigEnough); // false
let result1 = [12, 54, 18].some(isBigEnough); // true
// 接受箭头函数写法
[12, 5, 8, 130, 44].some(x => x >= 10); // false
[12, 54, 18, 130, 44].some(x => x >= 10); // true
filter
作用 :过滤原始数组,返回新数组
参数
- function:必需,数组中每个元素调用的函数
- currentValue:必需,数组当前元素的值
- index:可选,当前元素的索引值
- arr:可选,数组对象本身
- thisValue:可选,当执行回调函数时this绑定对象的值,默认值为undefined
let a = [1, 2, 4, 9]
let result = a.filter(a => a > 3)
console.log(result); //[4,9]
map
作用 :对数组中的每个元素进行处理,返回新的数组
参数
- function:必需,数组中每个元素调用的函数
- currentValue:必需,数组当前元素的值
- index:可选,当前元素的索引值
- arr:可选,数组对象本身
- thisValue:可选,当执行回调函数时this绑定对象的值,默认值为undefined
let a = [1, 2, 4, 9]
let result = a.map(a => a + 3)
console.log(result); //[4,5,7,12]
注意
map和forEach都能进行遍历,但与mpa不同的是forEach不能return,即forEach会改变原数组,map可以生成一个新的数组
reduce
作用 :为数组提供累加器,合并为一个值
参数
- function:必需,数组中每个元素需要调用的函数
- total:必需,初始值或者上一次调用回调返回的值
- currentValue:必需,数组当前元素的值
- index:可选,当前元素的索引值
- arr:可选,数组对象本身
- initialValue:可选,指定第一次回调的第一个参数
注意
- 如果initialValue有值,那么第一个total的值为initialValue,此时currentValue等于数组中的第一个值
- 如果initialValue未提供,那么total等于数组中的第一个值,currentValue为数组中的第二个值
let a = [1, 3, [2, 5], 7]
let b = a.reduce(function (a, b) {
return a.concat(b)
}, [])
console.log(b); // 1, 3, 2, 5, 7 ]
let c = b.reduce((a, b) => a + b, 2)
console.log(c); // 20
find() findIndex()
作用 :根据条件找到数组成员
参数
- function:必需,数组中每个元素调用的函数
- currentValue:必需,数组当前元素的值
- index:可选,当前元素的索引值
- arr:可选,数组对象本身
- thisValue:可选,当执行回调函数时this绑定对象的值,默认值为undefined
注意
这两个方法都可以识别NaN,弥补 indexOf 的不足
// find
let a = [1, 4, -7, 22].find((n) => n < 0); // 返回索引-7
let b = [1, 4, -7, 22, NaN].find((n) => Object.is(NaN, n)); // 为true时返回NaN
// findIndex
let a = [1, 4, -7, 22].findIndex((n) => n < 0); // 返回索引2
let b = [1, 4, -7, 22, NaN].findIndex((n) => Object.is(NaN, n)); // weitrue时返回索引4
参照文章
【干货】js 数组详细操作方法及解析合集 - 掘金 (juejin.cn)
总结
最近也在准备面试,将数组的方法再次进行了总结并且产出了文章,在写文章的同时也感觉到对知识更深入了解。感谢大佬们的文章,他们的知识对我的学习起着至关重要的作用。