目录
3.Array.prototype.copyWithin(target,start,end)
一、前言
无论是学习还是使用Javascript最绕不开的数据结构之一:Array数组,在平常的开发中我们需要对数组进行一系列的操作,如果都靠自己手写完成是很麻烦的一件事,所以熟练的掌握和使用Array的内置函数尤为重要。
熟练的使用内置函数可以:
- 提升代码的简洁性
- 能拥有更好的效率和性能
- 提高代码的可读性
二、Array内置方法详解
1.Array.prototype.at()
方法描述:
方法接收一个整数值并返回该索引对应的元素,允许正数和负数。负整数从数组中的最后一个元素开始倒数。
参数:
要返回的数组元素的索引(从零开始)。负数索引从数组末尾开始计数——如果 index < 0
,则会访问 index + array.length
位置的元素。
let arr = [1, 2, 3, 4, 5]
console.log(arr.at(0)) //=>1
console.log(arr.at(-1)) //=>5
可以看到我们是可以像python那样获取末尾的数组数据,但是要注意这是数组的方法而不是可以通过索引直接访问.
返回值:
返回数组中与给定索引匹配的元素。如果 index < -array.length
或 index >= array.length
,则总是返回 undefined,而不会尝试访问相应的属性。
let arr = [1, 2, 3, 4, 5]
console.log(arr.at(7)) //=>undefined
console.log(arr.at(-6)) //=>undefined
如何不带索引值,则会默认返回第一个元素
let arr = [1, 2, 3, 4, 5]
console.log(arr.at()) //=>1
在非数组上调用at方法,我们可以使用call来改变this的指向
const arrayLike = {
length: 3,
0: 'a',
1: 'b',
2: 'c'
}
console.log(Array.prototype.at.call(arrayLike, -1)) // => "c"
这里的arrayLike是一个类数组对象,索引必须要严格递增,不可以跳过前面的索引,否则无法正常返回。
2.Array.prototype.concat()
方法描述:
concat()
方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
参数:
数组和/或值,将被合并到一个新的数组中
返回值:
返回一个合并后的数组
示例:
1.数组合并值(包括字符串,函数等)
const array1 = ['a', 'b', 'c']
const array4 = array1.concat('d', 1, function () {
console.log(111)
})
console.log(array4)
array4.forEach(function (item) {
//用来测试方法是否可执行
if (typeof item === 'function') {
item()
}
})
运行结果:
2.合并多个数组
const array1 = ['a', 'b', 'c']
const array2 = ['d', 'e', 'f']
const array3 = ['g', 'h', 'i']
const array4 = array1.concat(array2, array3)
console.log(array4) // => ['a','b','c','d','e','f','g','h','i']
3.合并多重数组(复杂数组元素),如果存在空值,会保留,并返回empty
const array1 = ['a', 'b', 'c']
const array2 = ['d', 1, ,['e',['f']],function list() {
console.log(111);
}]
const array4 = array1.concat(array2)
console.log(array4)
输出:
3.Array.prototype.copyWithin(target,start,end)
方法描述:
copyWithin()
方法浅复制数组的一部分到同一数组中的另一个位置,并返回它,不会改变原数组的长度。
参数:
1.target(必选)复制到的目标位置的索引。
2.start(可选)复制元素的起始位置的索引(包含该位置的元素),默认值为0。如果为负值,则表示倒数的索引(-1 表示数组最后一个元素
3.end(可选)复制元素的结束位置的索引(不包含该位置的元素),默认值为数组的长度。如果为负值,则表示倒数的索引。
返回值:
被改变的数组
示例:
1.只有target
const array1 = [1, 2, 3, 4, 5, 6, 7, 8]
console.log(array1.copyWithin(2)) // [1, 2, 1, 2, 3, 4, 5, 6]
console.log(array1.copyWithin(4)) // [1, 2, 3, 4, 1, 2, 3, 4]
方法执行流程:
- 因为没有参数表明复制的位置,所以默认复制数组的所有元素
- 然后用复制的元素覆盖指定索引位置后的所有元素
2.有start
const array1 = [1, 2, 3, 4, 5, 6, 7, 8]
console.log(array1.copyWithin(2, 4)) // [1, 2, 5, 6, 7, 8, 7, 8]
方法执行流程:
- 从指定的索引 ”4“ 开始复制,也就是从元素 “5“ 开始复制
- 然后替换索引 ”2“ 后面的所有元素
3.有start和end
const array1 = [1, 2, 3, 4, 5, 6, 7, 8]
console.log(array1.copyWithin(2, 4, 6)) // [1, 2, 5, 6, 5, 6, 7, 8]
如果前面二个例子理解了的话这个就迎刃而解了
执行流程:
- 复制指定索引的元素为:[5,6]
- 然后替换掉索引 ”2“ 位置后的元素
4.Array.prototype.entries()
方法描述:
entries()
方法返回一个新的数组迭代器对象,该对象包含数组中每个索引的键/值对。
无参数
返回值:
返回一个新的迭代器对象
示例:
var fruits = ['Banana', 'Orange', 'Apple', 'Mango']
var f = fruits.entries()
for (x of f) {
console.log(x)
}
输出值:
5. Array.prototype.every()
方法描述:
every()
方法测试一个数组内的所有元素是否都能通过指定函数的测试。它返回一个布尔值。
参数:
callbackFn:(必需)用来测试每个元素的函数
thisArg:(可选),在执行回调函数时使用的this值。
返回值:
如果都满足:true,否则:false
示例:
1.检查数组所有元素的大小
function isBigEnough(element) {
return element >= 10
}
let arr = [10, 20, 30, 40, 5]
console.log(arr.every(isBigEnough)) // false
console.log(arr.every((item) => item > 1)) // true
2.检查一个数组是否是另外一个数组的子集
const isSubset = (array1, array2) => array2.every((element) => array1.includes(element))
console.log(isSubset([1, 2, 3, 4, 5, 6, 7], [5, 7, 6])) // true
console.log(isSubset([1, 2, 3, 4, 5, 6, 7], [5, 8, 7])) // false
includes方法我们后续会讲到,其作用就是检查数组是否包含指定的元素
3.在稀疏数组上使用
console.log([1, , 3].every((item) => item !== undefined)) // true
console.log([2, , 2].every((item) => item === 2)) // true
可以看到every会忽略空槽