Skip to content

Array

会修改变原数组的 9 个方法

push()

  • 用法:将一个或者多个元素添加到数组末尾,并且返回该数组的新长度。

pop()

  • 用法:删除数组最后一个元素,并返回删除的元素。

unshift()

  • 用法:将一个或者多个元素添加到数组的第一位,并且返回该数组的新长度。

shift()

  • 用法:删除数组的第一个元素,并返回删除的元素。

sort()

  • 用法:数组排序。

reverse()

  • 用法:数组逆序。

splice()

  • 用法:裁剪数组(删除或替换或添加新元素)。

copyWithin() es6

  • 用法:在当前数组内部,将指定位置的成员复制到其他位置,并返回这个数组。

fill() es6

  • 用法:使用给定值,填充一个数组。
js
// 第一个元素(必须): 要填充数组的值。
// 第二个元素(可选): 填充的开始位置,默认值为 0。
// 第三个元素(可选): 填充的结束位置,默认是为 this.length。
Array.fill(value, start, end);
// 第一个元素(必须): 要填充数组的值。
// 第二个元素(可选): 填充的开始位置,默认值为 0。
// 第三个元素(可选): 填充的结束位置,默认是为 this.length。
Array.fill(value, start, end);

不会修改变原数组的 10 个方法

concat()

  • 用法:数组拼接(合并两个或多个数组,返回一个新数组)。

slice()

  • 用法:方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。

jion()

  • 用法:数组转字符串(数组中的所有元素通过指定的分隔符进行分隔放入一个字符串,返回生成的字符串)。

indexOf()

  • 用法:查找数组是否存在某个元素,返回下标,如果不存在,则返回-1。

lastIndexOf()

  • 用法:返回指定元素,在数组中的最后一个的索引,如果不存在则返回 -1。

includes() es7

  • 用法:查找数组是否包含某个元素,返回布尔。

flat()es6

  • 用法:用于将嵌套的数组“拉平”。

flatMap()es6

  • 用法:对原数组的每个成员执行一个函数,相当于执行Array.prototype.map(),然后对返回值组成的数组执行flat()方法。

toLocaleString()

  • 用法:返回一个表示数组元素的字符串。

toString()

  • 用法:数组转字符串,返回字符串。

遍历数组的 12 个方法

forEach()

  • 用法:方法按升序为数组中含有效值的每一项执行一次 callback 函数。

注意:

  • 无法中途退出循环,只能用 return 退出本次回调,进行下一次回调。
  • 它总是返回 undefined 值,即使你 return 了一个值。

filter()

  • 用法:过滤原始数组,返回新数组。

map()

  • 用法:对数组中的每个元素进行处理,返回新的数组。

some()

  • 用法:数组中的是否有满足判断条件的元素,返回布尔值。

every()

  • 用法:组所有元素是否都符合判断条件,返回布尔值。

find() es6

  • 用法:方法返回数组中满足提供的测试函数的第一个元素的值,否则返回 undefined。

findIndex() es6

  • 用法:方法返回数组中满足提供的测试函数的第一个元素的索引。若没有找到对应元素则返回-1。

符合以上遍历数组的通式

js
// fn指代 forEach、map、some、every
// currentValue(必须),数组当前元素的值
// index(可选), 当前元素的索引值
// arr(可选),数组对象本身
// thisValue(可选): 当执行回调函数时this绑定对象的值,默认值为undefined
 array.fn(function(currentValue, index, arr), thisValue)
// fn指代 forEach、map、some、every
// currentValue(必须),数组当前元素的值
// index(可选), 当前元素的索引值
// arr(可选),数组对象本身
// thisValue(可选): 当执行回调函数时this绑定对象的值,默认值为undefined
 array.fn(function(currentValue, index, arr), thisValue)

reduce()、reduceRight()

这个方法唯一区别就是方向不一样,一个从左往右,一个从右往左。

  • 用法:为数组提供累加器,返回最终计算结果。
js
// accumulator(必选):累计器累计回调的返回值; 它是上一次调用回调时返回的累积值。
// currentValue(必选):当前值
// currentIndex(可选):当前索引
// array(可选):调用reduce()的数组
// initialValue(可选):作为第一次调用 callback函数时的第一个参数的值。

array.reduce(callback(accumulator, currentValue, index, array), initialValue);
// accumulator(必选):累计器累计回调的返回值; 它是上一次调用回调时返回的累积值。
// currentValue(必选):当前值
// currentIndex(可选):当前索引
// array(可选):调用reduce()的数组
// initialValue(可选):作为第一次调用 callback函数时的第一个参数的值。

array.reduce(callback(accumulator, currentValue, index, array), initialValue);

注意:

  • 如果没有提供 initialValue,reduce 会从索引 1 的地方开始执行 callback 方法,跳过第一个索引。如果提供 initialValue,从索引 0 开始。
  • 如果没有提供初始值,则默认为数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。

keys()、values()、entries() 遍历键名、遍历键值、遍历键名+键值 es6

  • 用法:三个方法都返回一个新的 Array Iterator 对象,对象根据方法不同包含不同的值。
js
array.keys(); // 键名 index
array.values(); // 键值 值
array.entries(); // 键名+键值
array.keys(); // 键名 index
array.values(); // 键值 值
array.entries(); // 键名+键值

Array上的方法

isArray()

  • 判断是否为数组

from()

  • 1、返回一个数组实例
  • 2、入参为:一个类数组或者一个可迭代对象

of()

for 循环 while 循环性能对比

js
let arr = new Array(9999999).fill(1)

// for
console.time('forTime')
for(let i = 0; i< arr.length; i++){}
console.timeEnd('forTime')

// while
console.time('whileTime')
let i = 0
while(i< arr.length){i ++ }
console.timeEnd('whileTime')

// forTime: 6.72802734375 ms
// whileTime: 20.7080078125 ms
let arr = new Array(9999999).fill(1)

// for
console.time('forTime')
for(let i = 0; i< arr.length; i++){}
console.timeEnd('forTime')

// while
console.time('whileTime')
let i = 0
while(i< arr.length){i ++ }
console.timeEnd('whileTime')

// forTime: 6.72802734375 ms
// whileTime: 20.7080078125 ms

原因:

  • 使用 let 声明下的循环,由于 for 中块级作用域的影响,内存得到释放,运行的运行的速度会更快一些。
  • 使用 var 声明时因为for while 的循环都不存在块级作用域的影响,两者运行的速度基本一致。

forEach、for...of、for...in 区别

  • forEach:
    • 是Array.prototype上的方法。用于遍历数组中的每个元素,执行回调函数,没有返回值。
    • 不能使用break跳出循环,只能使用try/catch捕捉异常来跳出循环。
js
arr.forEach((item) => {
  if (item === 3) {
    throw new Error('End loop');
  }
  console.log(item);
});
arr.forEach((item) => {
  if (item === 3) {
    throw new Error('End loop');
  }
  console.log(item);
});
  • for...of:

    • for of 循环的原理是按照是否有迭代器规范来循环的,所有带有 Symbol.iterator 的都是实现了迭代器规范(Array,Set,Map,generator...)。
    • 对象没有实现 Symbol.iterator 规范,所以不能使用for of循环。
    • 可以使用break跳出循环。
  • for...in:

    • 循环主要用于对象
    • 可以使用break跳出循环。
    • for...in无法遍历 Symbol属性(不可枚举)。

for in 的循环性能循环很差。性能差的原因是因为:for in 会迭代对象原型链上所有可以枚举的属性。

拓展:

如何实现类数组可以使用 for of 循环:

  • 只需要给类数组对象添加Symbol.iterator接口规范就可以了。
js
let obj = { 0:'a',1:'b',2:'3' }
obj[Symbol.iterator] = Array.prototype[Symbol.iterator]
let obj = { 0:'a',1:'b',2:'3' }
obj[Symbol.iterator] = Array.prototype[Symbol.iterator]

类数组转换为数组方法:

arguments 是类数组(其实是一个对象)属性从0开始排,依次为0,1,2... 最后还有 callee和length 属性,arguments 的 proto 直接指向基类的 object,不具备数组的方法。

  • 方法一:[].slice.call()
js

function fn(){
    let arr = [].slice.call(arguments)
    return arr
}
fn(1,2,3,4,5)   // [1,2,3,4,5]

function fn(){
    let arr = [].slice.call(arguments)
    return arr
}
fn(1,2,3,4,5)   // [1,2,3,4,5]
  • 方法二:拓展运算符
js
function fn(){
    let arr = [...arguments]
    return arr
}
fn(1,2,3,4,5)   // [1,2,3,4,5]
function fn(){
    let arr = [...arguments]
    return arr
}
fn(1,2,3,4,5)   // [1,2,3,4,5]
  • 方法三:Array.from()
js
function fn(){
    return Array.from(arguments)
}
fn(1,2,3,4,5)   // [1,2,3,4,5]
function fn(){
    return Array.from(arguments)
}
fn(1,2,3,4,5)   // [1,2,3,4,5]