1. Array.from()
Array.from方法用于将两类对象转为真正的数组:类似数组的对象和可遍历的对象。
先看一个例子
let fakeArr = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
}
// es5的写法
var arr1 = [].slice.call(fakeArr)
// es6的写法
var arr2 = Array.from(fakeArr)
只要是部署了Iterator接口的数据结构,Array.from都可以将其转为数组。
如果参数是一个真正的数组,Array.from会返回一个一模一样的新数组。值得注意的是,扩展运算符(…)也可以将某些数据结构转为数组。扩展运算符背后调用的是遍历器接口,如果对象没有部署就不能转换。Array.from方法还支持类数组对象。所谓类数组对象,本质只有一点,就是必须有length属性。所以,任何有length属性的对象,都可以通过Array.from转为数组,而此时扩展运算符就无法转换。
Array.from({length: 3})
// [undefined,undefined,undefined]
对于还没有部署这个方法的浏览器,可以用Array.prototype.slice方法代替
const toArray = (() =>
Array.from ? Array.from : obj => [].slice.call(obj)
)()
Array.from还可以接受第二个参数,类似于map方法,对每个元素进行处理,将处理后的值放入返回的数组。
Array.from(arrayLike, x => x * x);
// 等同于
Array.from(arrayLike).map(x => x * x);
如果map函数里面用到了this关键字,还可以传入Array.from的第三个参数,用来绑定this。
Array.from可以将各种值转为真正的数组,并且提供map功能。这实际上意味着,只要有一个原始的数据结构,就可以对他的值进行处理,然后转成规范的数组结构,进而就可以使用数量众多的数组方法。
Array.from({length: 2},() => 'Peggy')
// ['Peggy','Peggy']
Array.from的第一个参数指定了第二个参数运行的次数。这种特性可以让该方法的用法变得很灵活。
Array.from的另一个应用是将字符串转为数组,然后返回字符串的长度。
2. Array.of()
Array.of方法用于将一组值,转为数组。且不存在由于参数不同而导致的重载。
Array.of(3, 11, 8) // [3,11,8]
Array.of(3) // [3]
Array.of(3).length // 1
这个方法主要是为了弥补数组构造函数Array的不足,因为参数个数不同,会导致Array()行为有差异
Array() // []
Array(3) // [, , ,]
Array(3, 11, 8) // [3, 11, 8]
只有当参数个数不少于2时,Array()才会返回有参数组成的新数组,参数个数只有一个的时候,实际上是指定数组的长度。
Array.of总是返回参数值组成的数组,如果没有参数,就返回一个空数组。等同于
function ArrayOf(){
return [].slice.call(arguments)
}
3. 数组实例的copyWithin
数组实例的copyWith,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。也就是说使用这个方法,会修改当前数组。
接收三个参数:
- target(必需):从该位置开始替换数据。
- start(可选):从该位置开始读取数据,默认为 0。如果为负值,表示从末尾开始计算。
- end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示从末尾开始计算。
4. 数组实例的find和findIndex
数组实例的find方法,用于找出第一个符合条件的数组成员。他的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员,如果没有返回undefined。
[1, 5, 10, 15].find(function(value, index, arr) {
return value > 9;
}) // 10
find方法可以接受三个参数,分别为当前值,当前位置和原数组。
findIndex方法和find方法非常类似,返回第一个符合条件的数组成员的位置,否则返回-1。
另外,这两个方法都可以发现NaN
,弥补了数组的indexOf
方法的不足。