Array

coderljw 2024-10-13 JS 基础
  • JS 基础
  • Array
大约 5 分钟

# 1. Array(any...) & Array.of(any...)

  • 构造函数创建数组。

  • Array.of(3) 创建一个具有单个元素 3 的数组,而 Array(3) 创建一个长度为 3 的空数组。

Array() // => []
Array(2) // => [empty × 2] (不可遍历!)
Array(2, 9) // => [2, 9]

Array.of() // => []
Array.of(2) // => [2]
Array.of(2, 9) // => [2, 9]
1
2
3
4
5
6
7

# 2. Array.from(arrayLike | iterable, callback, this)

  • 将类数组或可迭代对象转换为数组。

  • 第二个参数可传递一个回调函数。

const ary = {
  0: '姜姒',
  1: '徐扶墙',
  length: 2,
}

Array.from(ary) // => ['姜姒', '徐扶墙']
Array.from('jack') // => => ['j', 'a', 'c', 'k']

Array.from(ary, (item, index) => `${item}7`) // => ['姜姒7', '徐扶墙7']

// 快速创建指定长度数组(可遍历)
Array.from({ length: 2 }) // => [undefined, undefined]
1
2
3
4
5
6
7
8
9
10
11
12
13

# 3. Array.isArray(any)

  • 判断是否为数组。
Array.isArray([]) // => true
1

# 4. join(string)

  • 默认以逗号连接数组每一项。

  • 数组中的 null 与 undefined 会转换为空字符串。

[1, null, 3, undefined, 5].join() // => '1,,3,,5'
1

# 5. concat(any...)

  • 可以连接任意类型数据。
[1, 2].concat([3, 4, 5], [6, 7]) // => [1, 2, 3, 4, 5, 6, 7]

[1, 2].concat('777', new Date()) // => [1, 2, '777', Thu Jan 01 1970 00:00:00 GMT+0800 (中国标准时间)]
1
2
3

# 6.slice(beginIndex, endIndex)

  • 从开始索引截取至结束索引,若结束索引未指定,截取至末尾,负数反序截取(包含开始索引,不包含结束索引)。
[1, 2, 3, 4, 5].slice(1) // => [2, 3, 4, 5]
[1, 2, 3, 4, 5].slice(1, 3) // => [2, 3]

// 开始索引溢出,返回空数组
[1, 2, 3, 4, 5].slice(7) // => []
// 取数组最后一项
[1, 2, 3, 4, 5].slice(-1)[0] // => 5
1
2
3
4
5
6
7

# 7. fill(any, startIndex, endIndex)

  • 默认以 undefined 填充数组每一项。

  • 第二个参数为开始索引,第三个参数项为结束索引(包含开始索引,不包含结束索引)。

[1, 2, 3, 4, 5].fill(7) // => [7, 7, 7, 7, 7]
[1, 2, 3, 4, 5].fill() // [undefined, undefined, undefined, undefined, undefined]
[1, 2, 3, 4, 5].fill(7, 2, 4) // => [1, 2, 7, 7, 5]

// 快速创建指定长度数组
Array(7).fill(7) // => [7, 7, 7, 7, 7, 7, 7]
1
2
3
4
5
6

# 8. flat(depth)

  • 默认扁平化一级。
[1, , [2, 3, [4, 5]]].flat() // => [1, 2, 3, [4, 5]]
[1, , [2, 3, [4, 5]]].flat(Infinity) // => [1, 2, 3, 4, 5]
1
2

# 9. flatMap(callback, this)

  • 与 map 连着深度值为 1 的 flat 几乎相同(flatMap = ary => ary.flat().map(_ => _))。
[1, , [2, 3, [4, 5]]].flatMap((item, index) => item) // => [1, 2, 3, [4, 5]]
1

# 10. indexOf(element, beginIndex)

  • 返回元素首次出现的索引位置,未找到返回 -1。

  • 第二个参数为开始查找位置。

  • 当查找数组中是否存在 NaN 时为返回 -1。

[1, 2, 3, 4, 3, 5].indexOf(3) // => 2
[1, 2, 3, 4, 3, 5].indexOf(3, 5) // => -1

[NaN].indexOf(NaN) // => -1
1
2
3
4

# 11. lastIndexOf(element, endIndex)

  • 返回元素最后出现的索引位置,未找到返回 -1。

  • 第二个参数为截止查找位置。

  • 当查找数组中是否存在 NaN 时为返回 -1。

[1, 2, 3, 4, 3, 5].lastIndexOf(3) // => 4
[1, 2, 3, 4, 3, 5].lastIndexOf(3, 3) // => 2

[NaN].lastIndexOf(NaN) // => -1
1
2
3
4

# 12. includes(element, beginIndex)

  • 判断数组中是否存在指定元素,解决了 indexOf() 方法,当数组中存在 NaN 的情况。

  • 第二个参数指定开始查找索引。

[1, 2, 3, 4, 5].includes(2) // => true
[1, 2, 3, 4, 5].includes(2, 2) // => false

[NaN].includes(NaN) // => true
1
2
3
4

# 13. find(callback, this)

  • 返回第一个满足条件的项,都不满足返回 undefined。
[1, 2, 3, 4, 3, 5].find((item, index) => item >= 3) // => 3
[1, 2, 3, 4, 3, 5].find((item, index) => item === 7) // => undefined
1
2

# 14. findIndex(callback, this)

  • 返回第一个满足条件项的索引,都不满足返回-1。

  • 与 indexOf 的区别是传递一个回调函数。

[1, 2, 3, 4, 3, 5].findIndex((item, index) => item >= 3) // => 2
[1, 2, 3, 4, 3, 5].findIndex((item, index) => item === 7) // => -1
1
2

# 15. forEach(callback, this)

  • 遍历数组,返回 undefined。
[1, 2, 3, 4, 5].forEach((item, index) => console.log(item * 2)) // => undefined
1

# 16. map(callback, this)

  • 遍历数组,返回结果项组成的新数组。
[1, 2, 3, 4, 5].map((item, index) => item * 2) //  => [2, 4, 6, 8, 10]
1

# 17. every(callback, this)

  • 检测数组中是否每一项都满足条件。

  • 空数组会返回 true(使用时先判断下是否为空数组哟!)

[1, 2, 3, 4, 5].every((item, index) => item > 3) // => false
[].every((item, index) => item > 3) // => true
1
2

# 18. some(callback, this)

  • 检测数组中是否有一项满足条件。

  • 空数组会返回 false。

[1, 2, 3, 4, 5].some((item, index) => item > 3) // => true
1

# 19. filter(callback, this)

  • 根据指定条件过滤出新数组。
[1, 2, 3, 4, 5].filter((item, index) => item > 2) // => [3, 4, 5]

// 过滤假值
[false, null, undefined, NaN, 0, 0n, '', document.all, 7].filter(Boolean) // => [7]
1
2
3
4

# 20. reduce(callback, initValue)

// total:上一个回调函数的返回值;current:当前项的值;currentIndex:当前项的索引;
[1, 2, 3, 4, 5].reduce((total, current, currentIndex) => total + current) // => 15
[1, 2, 3, 4, 5].reduce((total, current, currentIndex) => total + current, 7) // => 22

[].reduce((total, current, currentIndex) => total + current) // Uncaught TypeError: Reduce of empty array with no initial value
1
2
3
4
5

# 21. reduceRight(callback, initValue)

  • 与 reduce 类似,不过从最后一项开始累加,不传初始值时会拿最后一个元素作为初始值。

  • 在空数组上调用,且未提供初始值,会报错(使用时最好写上初始值哟!)。

[1, 2, 3, 4, 5].reduceRight((total, current, currentIndex) => total + current) // => 15

[].reduceRight((total, current, currentIndex) => total + current) // Uncaught TypeError: Reduce of empty array with no initial value
1
2
3

# 22. keys() & values() & entries()

  • 返回由数组 index/value/[index, value] 组成的可迭代对象。
const ary = ['jack', 'pony', 'coderljw']

for (const index of ary.keys()) console.log(index) // 依次打印:0 -> 1 -> 2

for (const value of ary.values()) console.log(value) // 依次打印:'jack' -> 'pony' -> 'coderljw'

for (const [index, value] of ary.entries()) console.log(index, value) // => 依次打印:0 'jack' -> 1 'pony' -> 2 'coderljw'
1
2
3
4
5
6
7

# 23. at(index)

  • 根据索引取值,默认索引为 0,负数反序取值(可简化通过 length 计算的索引)。
[1, 2, 3, 4, 5].at(-1) // => 5
1
以父之名
周杰伦.mp3