Array.of()
将参数中所有值作为元素形成数组。
console
.
log
(
Array
.
of
(
1
,
2
,
3
,
4
)
)
;
Array.from()
将类数组对象或可迭代对象转化为数组。
Array.from(arrayLike[, mapFn[, thisArg]])
返回值为转换后的数组。
arrayLike
想要转换的类数组对象或可迭代对象。
console
.
log
(
Array
.
from
(
[
1
,
2
,
3
]
)
)
;
mapFn
可选,map 函数,用于对每个元素进行处理,放入数组的是处理后的元素。
console.log(Array.from([1, 2, 3], (n) => n * 2)); // [2, 4, 6]
thisArg
可选,用于指定 map 函数执行时的 this 对象。
let
map
=
{
do
:
function
(
n
)
{
return
n
*
2
;
let
arrayLike
=
[
1
,
2
,
3
]
;
console
.
log
(
Array
.
from
(
arrayLike
,
function
(
n
)
{
return
this
.
do
(
n
)
;
}
,
map
)
)
;
类数组对象
一个类数组对象必须含有 length 属性,且元素属性名必须是数值或者可转换为数值的字符。
let
arr
=
Array
.
from
(
{
0
:
'
1
'
,
1
:
'
2
'
,
2
:
3
,
length
:
3
}
)
;
console
.
log
(
arr
)
;
转换可迭代对象
转换 map
let
map
=
new
Map
(
)
;
map
.
set
(
'
key0
'
,
'
value0
'
)
;
map
.
set
(
'
key1
'
,
'
value1
'
)
;
console
.
log
(
Array
.
from
(
map
)
)
;
转换 set
let
arr
=
[
1
,
2
,
3
]
;
let
set
=
new
Set
(
arr
)
;
console
.
log
(
Array
.
from
(
set
)
)
;
转换字符串
let
str
=
'
abc
'
;
console
.
log
(
Array
.
from
(
str
)
)
;
扩展的方法
find()
查找数组中符合条件的元素,若有多个符合条件的元素,则返回第一个元素。
let
arr
=
Array
.
of
(
1
,
2
,
3
,
4
)
;
console
.
log
(
arr
.
find
(
item
=>
item
>
2
)
)
;
findIndex()
查找数组中符合条件的元素索引,若有多个符合条件的元素,则返回第一个元素索引。
let
arr
=
Array
.
of
(
1
,
2
,
1
,
3
)
;
fill()
将一定范围索引的数组元素内容填充为单个指定的值。
let
arr
=
Array
.
of
(
1
,
2
,
3
,
4
)
;
copyWithin()
将一定范围索引的数组元素修改为此数组另一指定范围索引的元素。
entries()
遍历键值对。
for
(
let
[
key
,
value
]
of
[
'
a
'
,
'
b
'
]
.
entries
(
)
)
{
console
.
log
(
key
,
value
)
;
keys()
遍历键名。
for
(
let
key
of
[
'
a
'
,
'
b
'
]
.
keys
(
)
)
{
console
.
log
(
key
)
;
values()
遍历键值。
for
(
let
value
of
[
'
a
'
,
'
b
'
]
.
values
(
)
)
{
console
.
log
(
value
)
;
includes()
数组是否包含指定值。
注意:与 Set 和 Map 的 has 方法区分;Set 的 has 方法用于查找值;Map 的 has 方法用于查找键名。
嵌套数组转一维数组
flat()
console
.
log
(
[
1
,
[
2
,
3
]
]
.
flat
(
)
)
;
flatMap()
先对数组中每个元素进行了的处理,再对数组执行 flat() 方法。
数组缓冲区
数组缓冲区是内存中的一段地址。
定型数组的基础。
实际字节数在创建时确定,之后只可修改其中的数据,不可修改大小。
创建数组缓冲区
通过构造函数创建:
let
buffer
=
new
ArrayBuffer
(
10
)
;
console
.
log
(
buffer
.
byteLength
)
;
视图是用来操作内存的接口。
视图可以操作数组缓冲区或缓冲区字节的子集,并按照其中一种数值数据类型来读取和写入数据。
DataView 类型是一种通用的数组缓冲区视图,其支持所有8种数值型数据类型。
数组缓冲区的特定类型的视图。
可以强制使用特定的数据类型,而不是使用通用的 DataView 对象来操作数组缓冲区。
通过数组缓冲区生成
let
buffer
=
new
ArrayBuffer
(
10
)
,
view
=
new
Int8Array
(
buffer
)
;
console
.
log
(
view
.
byteLength
)
;
通过构造函数
let
view
=
new
Int32Array
(
10
)
;
console
.
log
(
view
.
byteLength
)
;
length 属性不可写,如果尝试修改这个值,在非严格模式下会直接忽略该操作,在严格模式下会抛出错误。
let
view
=
new
Int16Array
(
[
1
,
2
]
)
;
view
.
length
=
3
;
console
.
log
(
view
.
length
)
;
定型数组可使用 entries()、keys()、values()进行迭代。
let
view
=
new
Int16Array
(
[
1
,
2
]
)
;
for
(
let
[
k
,
v
]
of
view
.
entries
(
)
)
{
console
.
log
(
k
,
v
)
;
find() 等方法也可用于定型数组,但是定型数组中的方法会额外检查数值类型是否安全,也会通过 Symbol.species 确认方法的返回值是定型数组而非普通数组。concat() 方法由于两个定型数组合并结果不确定,故不能用于定型数组;另外,由于定型数组的尺寸不可更改,可以改变数组的尺寸的方法,例如 splice() ,不适用于定型数组。
let
view
=
new
Int16Array
(
[
1
,
2
]
)
;
view
.
find
(
(
n
)
>
1
)
;
所有定型数组都含有静态 of() 方法和 from() 方法,运行效果分别与 Array.of() 方法和 Array.from() 方法相似,区别是定型数组的方法返回定型数组,而普通数组的方法返回普通数组。
let
view
=
Int16Array
.
of
(
1
,
2
)
;
console
.
log
(
view
instanceof
Int16Array
)
;
定型数组不是普通数组,不继承自 Array 。
let
view
=
new
Int16Array
(
[
1
,
2
]
)
;
console
.
log
(
Array
.
isArray
(
view
)
)
;
定型数组中增加了 set() 与 subarray() 方法。 set() 方法用于将其他数组复制到已有定型数组, subarray() 用于提取已有定型数组的一部分形成新的定型数组。
扩展运算符
let
arr
=
[
1
,
2
]
,
arr1
=
[
...
arr
]
;
console
.
log
(
arr1
)
;
console
.
log
(
[
...
[
1
,
2
]
,...
[
3
,
4
]
]
)
;