Array.of
Array.of方法用于将一组值,转换为数组
Array.of(1, 4, 6);
// [1, 4, 6]
Array.of(3);
// [3]
Array.of(3).length;
// 1
此方法主要弥补Array() 方法的不足,参数个数的不同,会导致Array() 返回的结果也不同
Array() // []
Array(3) // [undefined, undefined, undefined,]
Array(1, 4, 6) // [1, 4, 6]
上述一个参数和三个参数的结果完全不是理想状态
只有当参数不小于2个时,Array() 才会返回一个新数组
当参数只有一个时,实际值得是数组的长度
Array.of完全可以替代Array和new Array
Array.of(); // []
Array.of(undefined); // []
Array.of(3); // [3]
Array.of(1, 3, 5); [1, 3, 5]
Array.of 返回的就是参数个数项的具体值,如果参数为空,那就返回空数组
Array.of 模拟实现
function arrayOf () {
return [].slice.call(arguments)
}
arrayOf(1, 3, 5, 7)
// [1, 3, 5, 7]
数组实例的copyWithin()
修改当前数组实例的方法
从指定位置开始复制到其他位置(会覆盖原数据),返回当前实例
Array.prototype.copyWithin(target, start = 0, end = this.length)
三个参数
target (必填) 从这个位置开始替换,为负值,表示倒数
start (选填)从该位置开始读取,默认为0,如果为负值,表示倒数
end (选填) 从该位置停止读取,默认时数组长度,如果为负值,表示倒数
参数格式为number, 如果不是会转换为number
[1, 2, 3, 4, 5].copyWithin(0, 3);
上面表示,
从第0位开始替换,从第4位查找(4),
由于第三个参数没有写,默认数组长度4(5),
被查找替换的就是4 ,5 所以1, 2 就被替换掉了,
并返回当前替换之后的数组实例
[1, 2, 3, 4, 5].copyWithin(0, 3, 4)
// [4, 2, 3, 4, 5]
// 第三位开始第四位结束,截取4
[1, 2, 3, 4, 5].copyWithin(0, -2, -1)
// [4, 2, 3, 4, 5]
// -2为第三位, -1为第四位
[].copyWithin.call({length : 5, 3 : 1}, 0, 3)
// {0 : 1, 3 : 1, length: 5}
// 只是把3号位的赋值到0号位
[1, 2, 3, 4, 5].copyWithin(0, 2)
// [3, 4, 5, 4, 5]
// 从第二位开始截取到数组结束,复制到0位
数组实例的find() 和 findIndex()
数组实例的find方法,用于找到第一个符合条件的数组成员,他的参数是一个回调函数。
所有数组成员会一次执行该回调函数,直到找到第一个返回值为true的成员
如果找不到符合条件的值,那么就返回undefined
[1, 4, -5, 10].find((n) => n < 0);
// -5
上面代码找出第一个小于零的值
[1, 5, 10, 20].find(function (value, index, arr) {
return value > 9;
})
// 10
find方法可以接受三个参数,依次为当前值,当前索引,原数组
数组的findIndex方法的用法 与find方法非常类似,返回当前第一个符合条件值的索引位,如果整个数组没有匹配到,那么返回-1.
[1, 5, 10, 20].findIndex(function (value, index, arr) {
return value > 1
})
// 1
[1, 5, 10, 20].findIndex(function (value, index, arr) {
return value < 1
})
// -1
这两个方法都可以接受第二个参数,用来绑定回调函数的this对象
function foo (value) {
return value > this.age
}
let person = {age: 20, sex: 'male'}
[18, 19, 25, 30].find(foo, person)
// 25
这两个方法都可以弥补indexof 发现不了NaN
[NaN].indexof(NaN);
// -1
[NaN].findIndex( v => Object.is(NaN, v));
// 0
indexof无法获取正确的索引位置,但是findIndex可以弥补
借助了Object.is 把数组每一位对比NaN
数组实例的fill()
fill方法使用给定值,填充一个数组
['a', 'b', 'c'].fill(7)
// [7, 7, 7]
new Array(3).fill(7)
// [7, 7, 7]
上面代码初始化数组很实用,fill可以用来改变原数组
fill方法还可以接受第二个第三个参数,用于指定填充的其实位置和结束位置
['a', 'b', 'c'].fill(7, 1, 2)
// [a, 7, c]
// 从第一位开始,到第二位结束
如果填充的是数组或对象,那么实际保存的是一个引用值,即只是对应的指针
let arr = new Array(3).fill({name: 'mike'});
arr[0].name = 'ben';
arr
// [{name: 'ben'}, {name: 'ben'}, {name: 'ben'}]
let arr1 = new Array(3).fill([]);
arr1[0].push(5);
arr1
// [[5], [5], [5]]