创建一个数组

  1. new Array(长度)

长度,数组里面的数据总数,长度一定是一个非负整数

new Array(数据, 数据, 数据....)

创建一个数组,并初始化其每一项的值

数组项:数组其中的一项数据

  1. [数据,数据,数据,....]

创建一个数据,并初始化其每一项的值

认识数组的本质

数组的本质是一个对象

  • length属性:数组的长度,会自动变化,值为最大下标+1

  • 数字字符串属性:叫做下标,也叫做索引,相当于数组中每个数据的编号,下标从0开始排列

连续下标的取值范围:0 ~ length -1,如果给length直接赋值,会导致数组可能被截断

实际开发中,不要给length赋值。

下标

通常情况下,下标是连续的。

下标不连续的数组,叫做稀松数组。

数组[长度] = 数据:向数组末尾添加一个数据

delete 数组[下标]: 这种做法不会导致数组其他的属性发生变化,因此,该做法会导致产生稀松数组,所以不推荐使用该做法。

数组清空:

数组.splice(0, 数组.length);

数组.length = 0;

静态成员

  • from方法:可以将一个伪数组转换为真数组

    Array.from(arrayLike, mapFn, thisArg)

    arrayLike想要转换成数组的类数组或可迭代对象

    mapFn(可选)调用数组每个元素的函数。如果提供,每个将要添加到数组中的值首先会传递给该函数,然后将 mapFn 的返回值增加到数组中。使用以下参数调用该函数:

    • element

      数组当前正在处理的元素。

    • index

      数组当前正在处理的元素的索引。

    thisArg执行 mapFn 时用作 this 的值。

  • isArray方法:判断一个给定的数据,是否为一个真数组

  • of方法:类似于中括号创建数组,依次赋予数组每一项的值

  • fromAsync() 允许你从以下对象中创建数组:

    • 异步可迭代对象(如 ReadableStreamAsyncGenerator);或者,如果对象不是异步可迭代的,

    • 可迭代对象(如 MapSet);或者,如果对象是不可迭代的,

    • 类数组的对象(带有 length 属性和索引元素的对象)。

    Array.fromAsync() 迭代异步可迭代对象的方式与 for await...of 很相似。Array.fromAsync() 在行为上与 Array.from() 几乎等价,除了以下几点:

    • Array.fromAsync() 可以处理异步可迭代对象。

    • Array.fromAsync() 返回一个会兑现为数组实例的 Promise

    • 如果使用非异步可迭代对象调用 Array.fromAsync(),则要添加到数组中的每个元素(无论是否为 Promise)都会先等待其兑现

    • 如果提供了 mapFn,则其输入和输出会在内部等待兑现。

    Array.fromAsync()Promise.all() 都可以将一个 promise 可迭代对象转换为一个数组的 promise。然而,它们有两个关键区别:

    • Array.fromAsync() 会依次等待对象中产生的每个值兑现。Promise.all() 会并行等待所有值兑现。

    • Array.fromAsync() 惰性迭代可迭代对象,并且不会获取下一个值,直到当前值被兑现。Promise.all() 预先获取所有值并等待它们全部兑现。

实例成员

at()在传递非负数时,at() 方法等价于括号表示法。传递负数时array.at(-1)相当于array[array.length - 1]

方法名

含义

fill(数据) fill(数组, 开始下标) fill(数组, 开始下标,结束下标)

将数组的所有项,填充为指定的数据 将数组从开始下标起,到数组的末尾,填充为指定的数据 将数组从开始下标起,到数组的结束下标(取不到),填充为指定的数据

push(数据)

向数组末尾添加一个数据

unshift(数据)

向数组起始位置添加一个数据,会导致数组每一项的下标向后移动

pop()

删除数组的最后一项,该表达式返回最后一项的数据

shift()

删除数组第一项,该表达式返回第一项的数据

reverse()

将当前数组颠倒顺序

sort(函数)例如sort((a,b)=>a-b)

对数组进行排序

splice(下标, 删除的数量, 添加的数据)

从指定下标位置开始,删除指定数量,然后在该位置插入添加的数据,如果下标超过范围,则按照范围的边界进行处理。返回一个新数组,该数组记录被删除的数据。

splice(下标, 0, 添加的数据)

从指定下标位置开始,删除0个,然后在该位置插入添加的数据,如果下标超过范围,则按照范围的边界进行处理。

下面是纯函数、无副作用函数

不会导致当前对象发生改变

slice(起始位置下标, 结束位置下标)

将起始位置到结束位置之间的数据拿出来,得到一个新的数组,该函数不会改变原数组;注意:结束下标取不到。下标可以写负数,如果是负数,则从数组的末尾开始计算。可以不传参数,或只传一个参数。

indexOf(数据)

从数组中依次查找对应的数据,查找时使用严格相等进行比较。找到第一个匹配的下标,返回。如果没有找到,则得到-1;

lastIndexOf(数据)

功能和indexOf类似,只是查找的是最后一个匹配的下标

concat(value1、......、valueN)

用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。

includes()两个参数,需要查找的值,开始的索引(可选)

用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回 false

join(),可自行选择分隔符号

将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串,用逗号或指定的分隔符字符串分隔。如果数组只有一个元素,那么将返回该元素而不使用分隔符。

forEach(callbackFn, thisArg),第二个参数可选,fn中有三个参数可选,元素,索引,数组本身

对数组的每个元素执行一次给定的函数。

everyevery(callbackFn, thisArg)第二个参数可选,fn中有三个参数可选,元素,索引,数组本身

测试一个数组内的所有元素是否都能通过指定函数的测试。它返回一个布尔值。

some(callbackFn, thisArg)第二个参数可选,fn中有三个参数可选,元素,索引,数组本身

测试数组中是否至少有一个元素通过了由提供的函数实现的测试。如果在数组中找到一个元素使得提供的函数返回 true,则返回 true;否则返回 false。它不会修改数组。

filter(callbackFn, thisArg)第二个参数可选,fn中有三个参数可选,元素,索引,数组本身

创建给定数组一部分的浅拷贝,其包含通过所提供函数实现的测试的所有元素。过滤,得到满足条件的元素组成的新数组

find(callbackFn, thisArg)第二个参数可选,fn中有三个参数可选,元素,索引,数组本身

返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined

findIndex(callbackFn, thisArg)第二个参数可选,fn中有三个参数可选,元素,索引,数组本身

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

findLast(callbackFn, thisArg)第二个参数可选,fn中有三个参数可选,元素,索引,数组本身

反向迭代数组,并返回满足提供的测试函数的第一个元素的值。如果没有找到对应元素,则返回 undefined

findLastIndex(callbackFn, thisArg)第二个参数可选,fn中有三个参数可选,元素,索引,数组本身

反向迭代数组,并返回满足所提供的测试函数的第一个元素的索引。若没有找到对应元素,则返回 -1。

map(callbackFn, thisArg)第二个参数可选,fn中有三个参数可选,元素,索引,数组本身

创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成。

reduce(callbackFn, initialValue)第二个参数可选(第一次调用回调时初始化 accumulator 的值。),fn本身有四个参数,accumulator上一次调用 callbackFn 的结果,currentValue当前元素的值,currentValue在数组中的索引位置,本身数组

统计,累计。对数组中的每个元素按序执行一个提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。

reduceRight()

同上只是从右边开始

flat(depth),参数可选,指定要提取嵌套数组的结构深度,默认值为 1。

创建一个新的数组,并根据指定深度递归地将所有子数组元素拼接到新的数组中。

flatMap(callbackFn, thisArg)第二个参数可选,fn中有三个参数可选,元素,索引,数组本身

对数组中的每个元素应用给定的回调函数,然后将结果展开一级,返回一个新数组。它等价于在调用 map() 方法后再调用深度为 1 的 flat() 方法(arr.map(...args).flat()),但比分别调用这两个方法稍微更高效一些。

copyWithin(target, start, end) target序列开始替换的目标位置,以 0 为起始的下标表示,且将被转换为整数,负索引将从数组末尾开始计数——如果 target < 0,则实际是 target + array.length。如果 target < -array.length,则使用 0。如果 target >= array.length,则不会拷贝任何内容。如果 target 位于 start 之后,则复制只会持续到 array.length 结束(换句话说,copyWithin() 永远不会扩展数组)。start要复制的元素序列的起始位置,end要复制的元素序列的结束位置(不包括end)

方法浅复制数组的一部分到同一数组中的另一个位置,并返回它,不会改变原数组的长度。

[Symbol.iterator]

实现了可迭代协议,允许数组 被大多数期望可迭代对象的语法所使用,例如展开语法for...of 循环。它返回一个数组迭代器对象,该对象会产生数组中每个索引的值。

ArrayBuffer

ArrayBuffer:一个对象,用于存储一块固定内存大小的数据。

new ArrayBuffer(字节数)
​

可以通过属性byteLength得到字节数,可以通过方法slice得到新的ArrayBuffer

读写ArrayBuffer

  1. 使用DataView

通常会在需要混用多种存储格式时使用DataView

  1. 使用类型化数组

实际上,每一个类型化数组都对应一个ArrayBuffer,如果没有手动指定ArrayBuffer,类型化数组创建时,会新建一个ArrayBuffer

类型化数组

数字存储的前置知识

  1. 计算机必须使用固定的位数来存储数字,无论存储的数字是大是小,在内存中占用的空间是固定的。

  2. n位的无符号整数能表示的数字是2^n个,取值范围是:0 ~ 2^n - 1

  3. n位的有符号整数能表示的数字是2^n个,取值范围是:-2^(n-1) ~ 2^(n-1) - 1

  4. 浮点数表示法可以用于表示整数和小数,目前分为两种标准:

    1. 32位浮点数:又称为单精度浮点数,它用1位表示符号,8位表示阶码,23位表示尾数

    2. 64位浮点数:又称为双精度浮点数,它用1位表示符号,11位表示阶码,52位表示尾数

  5. JS中的所有数字,均使用双精度浮点数保存

类型化数组

类型化数组:用于优化多个数字的存储

具体分为:

  • Int8Array: 8位有符号整数(-128 ~ 127)

  • Uint8Array: 8位无符号整数(0 ~ 255)

  • Int16Array: ...

  • Uint16Array: ...

  • Int32Array: ...

  • Uint32Array: ...

  • Float32Array:

  • Float64Array

  1. 如何创建数组

new 数组构造函数(长度)
​
数组构造函数.of(元素...)
​
数组构造函数.from(可迭代对象)
​
new 数组构造函数(其他类型化数组)
​
  1. 得到长度

数组.length   //得到元素数量
数组.byteLength //得到占用的字节数
  1. 其他的用法跟普通数组一致,但是:

  • 不能增加和删除数据,类型化数组的长度固定

  • 一些返回数组的方法,返回的数组是同类型化的新数组