数组的扩展
Array.from()
Array.from
方法用于将两类对象转换成真正的数组
- 类似数组的对象(array-like object)
- 可遍历(iterable)对象
类似数组的对象(array-like object)
任何有length
属性的对象,都可以通过Array.from
转为数组
let arrayLike = {
0: 'a',
1: 'b',
2: 'c',
length: 3
}
Array.from(arrayLike) // ["a", "b", "c"]
可遍历(iterable)对象
只要部署了Iterator接口的数据结构,Array.form
都能将其转成数组
Array.from('hello')
// ["h", "e", "l", "l", "o"]
这种用法跟扩展运算法(...)用法一样,扩展运算法不支持转化类似数组对象
第二个参数
Array.from
第二个参数,类似数组 map
的用法,用来对每个元素进行处理,将处理后的值放入返回的数组
Array.from(arrayLike, x => x * x)
// 等同于
Array.from(arrayLike).map(x => x * x)
第三个参数
如果
map
函数里用到了this
关键字,还可以传入第三个参数绑定this
其他
Array.from
可以识别各种 Unicode字符,可以避免大于 \uFFFF
的Unicode字符算作两个字符的错误
Array.of()
Array.of
用于将一组值转换为数组
目的:你不构造函数Array()的不足
Array()
的行为会随参数的不同而不同,'Array.of' 基本上可以替代Array()
或new Array()
,并且不存在由于参数不同而导致重载
Array.of(1, 2, 3) // [1, 2, 3]
Array(3) // [ , , ,]
Array(1, 2, 3) // [1, 2, 3]
数组示例的find() 和 findIndex()
find()
方法用于找出第一个符合条件的数组成员,他的第一个参数是一个回调函数,所有数组成员一次执行该回调函数,知道找出第一个返回值为true
的成员,没有则返回undefined
find()
方法的回调函数可以接受3个参数 当前的值,当前的位置,原数组(value,key,array)
find()
可以接受第二个参数,用于绑定回调函数的this对象
findIndex()
与find()
类似,返回的是数组成员的位置
[1, 2, 3, 4, 5].find(value => value === 4) // 4
[1, 2, 3, 4, 5].findIndex(value => value === 4) // 3
find()
和findIndex()
可以用来弥补indexOf()
的不足,因为indexOf()
方法不能识别NaN
,而find()
和findIndex()
可以在回调函数中借助Object.is
方法
[1, 2, NaN, 4, 5].findIndex(value => value == NaN) // 2
数组示例的fill()
fill
方法给数组填充定值,第一个参数为要填充的值,第二个和第三个参数分别为填充起始位置和结束位置
[1, 2, 3].fill(0) // [0, 0, 0]
[1, 2, 3].fill(0, 1, 2) // [1, 0, 3]
数组示例的 entries(),keys(),values()
entries()
,keys()
,values()
用于遍历数组,它们都返回一个可遍历对象,可用for ... of
循环遍历
entries()
是键值对的遍历
keys()
是键名的遍历,数组中为位置
values()
是对键值的遍历
for (let index of[1, 2, 3].keys()) {
console.log(index)
}
// 0
// 1
// 2
数组示例的includes()
includes()
返回一个布尔值,表示数组是否包含给定的值,与字符串的includes()
方法类似
[1, 2, 3].includes(2) // true
indexOf
也可实现类似功能
if(arr.indexOf(el)!==-1){
// ...
}
但indexOf方法有以下缺点:
- 不够语义化
- 内部使用严格相当运算符(===)进行判断,导致对
NaN
的误判
数组的空位
数组的空位值数组的某一个位置没有任何值,如
Array
构造函数返回的数组都是空位
- 空位不是
undefined
, 一个位置等于undefined
依然是有值的,空位没有任何值- ES5 对空位的处理很不一致,大多数情况会忽略空位
- ES6 明确规定将空位转为
undefined
// Array.from 会将数组空位转成 undefined
Array.from([1, , 3]); // [1, undefined, 3]
// 扩展运算符(...)也会将空位转成 undefined
[...[4, , 6]]; // [4, undefined, 6]
数组推导
数组推导提供简洁写法,允许直接通过现有数组生成新数组
数组推导中,for ... of
结构总是写在最前面,返回表达式写在最后面,类似与Python
的写法
该方法为ES7方法
for ... of
后面可以附加if
语句,用于设定循环的条件
在一个数组推导中,还可以使用多个for ... of
结构,构成多重循环
let a1 = [1, 2, 3];
let a2 = [ for (i of a1) i * 2 ];
a2 // [2, 4, 6]
数组推导的方括号构成一个单独的作用域,其中声明的对象类似于使用
let
语句声明的变量
使用数组推导需要注意的地方时:新数组会立即在内存中生成,这是,如果原数组很大,将非常消耗内存