第四篇 引用类型 - 数组类型 - Array

1、概述

1、所有数组实例都继承于 Array.protoptype

2、所有的数组方法都定义在 Array.prototype 身上,和其他的构造函数一样,你可以通过扩展 Array 的 prototype 属性上的方法来给所有数组实例增加方法。

3、还一个鲜为人知的事实:Array.prototype 本身也是个数组。

Array.isArray(Array.prototype); // true

2、数组的属性

Array.prototype.constructor

所有的数组实例都继承了这个属性,它的值就是 Array,表明了所有的数组都是由 Array 构造出来的。

Array.prototype.constructor.call([1]) // []
Array.prototype.length

因为 Array.prototype 也是个数组,所有它也有 length 属性,这个值为 0,因为它是个空数组。

作用: 1、设置或返回数组的长度 2、用来增加和删除数组项

3、数组的创建

字面量方式
let arr = ['a','b','c'] => 字面量方式,直接给数组赋值
构造函数方式
let arr = new Array(); => 创建一个空数组
let arr = new Array(10); => 创建长度为10的数组
let arr = new Array('a') => 创建包含一个字符串元素a的数组
let arr = new Array(10,'a') => 创建包含10和字符串a两个元素的数组
Array.of ( ES6 新增 )

Array.of ()方法创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型。

let arr = Array.of(3) => [3]
let arr = Array(3) => [empty * 4]
let arr1 = Array.of(1, 'a', true, null, undefined, {name: "zhangsan"}, [45]); => [ 1, 'a', true, null, undefined, { name: 'zhangsan' }, [ 45 ] ]

4、数组的检测

两种较为准确的检测方法

利用对象的 toString 方法
Object.prototype.toString.call([]) === "[object Array]"
Array.isArray(); (ES6新增)
Array.isArray([1,2,3]) => true

5、数组的方法

数组的方法主要包括: 1、数组原型的方法。2、构造函数的方法 (ES6新增部分)

各方法主要学习: 1、作用 2、参数 3、返回值 4、原始数组是否改变

原型上的方法 (共 24 个)
push()
作用: 向数组的末尾添加一项或多项
参数: ele1,ele2,[...ele3]
返回值: push后数组的长度
原数组是否改变: 是
let arr = [1,2,3]
let arr_1 = arr.push(7,8)
console.log(arr) => [1,2,3,7,8]
console.log(arr_1) => 5
pop()
作用: 删除数组最后一项
参数: 无
返回值: 删除的那一项
原数组是否改变: 是
let arr = [1,2,3,4,5]
let arr_1 = arr.pop()
console.log(arr) => [1,2,3,4]
console.log(arr_1) => 5
unshift()
作用: 向数组的开头添加一项或多项
参数: ele1,ele2,[...ele3]
返回值: 添加元素后数组的长度
原始数组是否改变: 是
let uArr = [1,2,3]
let uArr_1 = uArr.unshift('a','b')
console.log(uArr) => ['a','b',1,2,3]
console.log(uArr_1) => 5
shift()
作用: 删除数组的第一项
参数: 无
返回值: 删除的那一项
原始数组是否改变: 是
let sArr = [1,2,3]
let sArr_1 = sArr.shift()
console.log(sArr) => [2,3]
console.log(sArr_1) => 1
splice()
作用: 删除、插入、替换数组项
参数: startIndex,deleteCount,item
返回值: 删除项组成的数组
是否改变数组: 是
let splArr = [1,2,3,4,5]
let splArr_1 = splArr.splice(2,1)
console.log(splArr) =>
console.log(splArr_1) =>
copyWithin()
作用: 将数组指定位置(startend)的元素复制到当前数组的其他位置(target开始),这种复制会替换原来位置的元素(ES6新增)
参数: target[start,end]
参数说明:
target: 复制的目标位置(包括),即要被替换的元素开始的位置
start: 要copy的元素的开始位置,默认0
end: 要copy的元素的结束位置,默认为数组最后一个元素
返回值: 复制替换之后的数组
原始数组是否改变: 是
reverse()
作用: 翻转原数组
参数: 无
返回值: 翻转后的数组
愿数组是否改变: 是
let rArr = [1,2,3]
let rArr_1 = rArr.reverse()
console.log(rArr) => [3,2,1]
console.log(rArr_1) => [3,2,1]
sort()
作用: 数组排序
参数: compareFunction
参数说明:
compareFunction 的值大于 0 时 调换当前比对项的顺序,否则顺序不变;
参数可以不传,不传默认按照 Unicode 编码的顺序排列
返回值: 排序后的数组
原数组是否改变: 是
let sArr = [1,2,3,4]
let sArr_1 = sArr.sort((a,b) => {
return a - b
} )
console.log(sArr) => [4,3,2,1]
console.log(sArr_1) => [4,3,2,1]
concat()
作用: 居于当前数组拼接数组
参数: 参数的类型可以是任意类型
不是数组类型直接按顺序拼接到数组末尾
数组类型的则将数组元素逐一取出拼接到数组末尾
不传则相当于复制数组
返回值: 拼接后的数组
原数组是否改变: 否
let cArr = [1,2]
let cArr_1 = cArr.concat('a',{id:1},[3,4])
console.log(cArr) => [1,2]
console.log(cArr_1) => [1,2,'a',{id:1},3,4]
let cArr_2 = cArr.concat([5,6])
console.log(cArr_2) => [1,2,5,6]
slice()
作用: 基于当前数组的一项或多项创建一个新的数组
参数: startIndex endIndex
参数说明: 返回的元素包含 startIndex 位置的元素 但不包含 endIndex 的元素
返回值: 返回截取的元素组成的数组
原数组是否改变: 否
let slArr = [1,2,3,4,5]
let slArr_1 = slArr.slice(2,4)
console.log(slArr) => [1,2,3,4,5]
console.log(slArr_1) => [3,4]
// 用于复制数组
let slArr_2 = slArr.slice(0)
console.log(slArr_2) => [1,2,3,4,5]
indexOf() ( ES5 )
作用: 从数组开头查找元素在数组中的索引位置
参数: searchElement fromIndex
返回值: searchElement在数组中的索引,没找到 searchElement 则 返回 -1
原数组是否改变: 否
let iArr = [1,2,3,4,5,6,7]
let iArr_1 = iArr.indexOf(3)
let iArr_2 = iArr.indexOf(9)
console.log(iArr) => [1,2,3,4,5,6,7]
console.log(iArr_1) => 2
console.log(iArr_2) => -1
lastIndexOf() ( ES5 )
作用: 从数组结尾查找元素在数组中的索引位置
参数: searchElement fromIndex
返回值: searchElement在数组中的索引,没找到 searchElement 则 返回 -1
原数组是否改变: 否
let lArr = [1,2,3,4,5,6,7]
let lArr_1 = lArr.indexOf(5)
let lArr_2 = lArr.indexOf(9)
console.log(lArr) => [1,2,3,4,5,6,7]
console.log(lArr_1) => 4
console.log(lArr_2) => -1
every() ( ES5 )
作用: 对数组的每一项运行指定的函数,如果该函数对每一项都返回 true ,则返回 true
参数: callback thisArg
参数说明: callback 有三个参数 item(当前项) index(当前索引) array(数组对象本身)
返回值: true or false
原数组是否改变: 涉及 callback 不确定
let eArr = [1,2,3,4,5]
let eArr_1 = eArr.every((item,index,array) => {
return item > 2
})
console.log(eArr) => [1,2,3,4,5]
console.log(eArr_1) => false
注意: 该方法的 第二个参数 可选 作用是设定第一个参数的 this 指向 , 如果使用了第二个参数,callback 不能使用箭头函数
let eArr_2 = eArr.every(function(item,index,array){
return item > this.id
},{id:2})
console.log(eArr) => [1,2,3,4,5]
console.log(eArr_2) => false
some() ( ES5 )
作用: 对数组中的每一项运行指定函数,如果该函数对任意一项返回 true 则返回 true
参数: callback thisArg
返回值: true or false
原始数组是否改变: 涉及 callback 不确定
let soArr = [1,2,3,4,5]
let soArr_1 = soArr.some((item,index,array) => {
return item > 2
})
console.log(soArr) => [1,2,3,4,5]
console.log(soArr_1) => true
注意: 该方法的 第二个参数 可选 作用是设定第一个参数的 this 指向 , 如果使用了第二个参数,callback 不能使用箭头函数
let soArr_2 = soArr.some(function(item,index,array){
return item > this.id
},{id:3})
console.log(soArr_2) => true
filter() ( ES5 )
作用: 对数组每一项运行给定的函数,返回该函数返回 true 的项 组成的数组
参数: callback thisArg
参数说明: callback 有三个参数 item(当前项) index(当前索引) array(数组对象本身)
返回值: 函数返回 true 的项组成数组
原始数组是否改变: 涉及 callback 不确定
let fArr = [1,2,3,4,5]
let fArr_1 = fArr.filter((item,index,array) => {
return item > 2
})
console.log(fArr) => [1,2,3,4,5]
console.log(fArr_1) => [3,4,5]
注意: 该方法的 第二个参数 可选 作用是设定第一个参数的 this 指向 , 如果使用了第二个参数,callback 不能使用箭头函数
let fArr_2 = fArr.filter(function(item,index,array){
return item > this.id
},{id:3})
console.log(fArr_2) => [4,5]
map() ( ES5 )
作用: 对数组中的每一项运行给定的函数,返回每次函数调用的结果组成的数组
参数: callback thisArg
参数说明: callback 有三个参数 item(当前项) index(当前索引) array(数组对象本身)
返回值: 函数每次调用结果组成的数组
原始数组是否改变: 涉及 callback 不确定
let mArr = [1,2,3,4,5]
let mArr_1 = mArr.map((item,index,array) => {
return item * item
})
console.log(mArr) => [1,2,3,4,5]
console.log(mArr_1) => [1,4,9,16,25]
注意: 该方法的 第二个参数 可选 作用是设定第一个参数的 this 指向 , 如果使用了第二个参数,callback 不能使用箭头函数
let mArr_2 = mArr.map(function(item,index,array){
return item * this.id
},{id:2})
console.log(mArr_2) => [2,4,6,8,10]
forEach() ( ES5 )
作用: 对数组中的每一项运行给定的函数。无返回值
参数: callback thisArg
参数说明: callback 有三个参数 item(当前项) index(当前索引) array(数组对象本身)
返回值: 无
原始数组是否改变: 涉及 callback 不确定
特别注意: 在所有项都遍历完成前 不能像 for 循环一样 提前终止循环
let foArr = [1,2,3,4,5]
let foArr_1 = forArr.forEach((item,index,array) => {
// 不会有返回值 但在这里可以执行某些操作
return item * item
})
console.log(foArr) => [1,4,9,16,25]
console.log(foArr_1) => undefined
注意: 该方法的 第二个参数 可选 作用是设定第一个参数的 this 指向 , 如果使用了第二个参数,callback 不能使用箭头函数
let forArr_2 = forArr.forEach(function(item,index,array){
return item + this.id
},{id:2})
console.log(foArr) => [3,4,5,6,7]
reduce() ( ES5 )
作用: 从数组的第一项开始,逐步遍历到最后,迭代数组的所有项
参数: callback initialValue
参数说明:
callback迭代函数,有四个参数(pre,cur,index,array)
pre: 前一个值,(initialValue || 数组第一项 || 上一次迭代结果)
cur: 当前迭代项
index: 当前迭代索引
array: 迭代的原始数组
initialValue: 迭代的基础值,不传基础值是数组第一项
返回值: 数组迭代后,数组的迭代结果
原始数组是否改变: 涉及 callback 不确定
let rArr = [1,2,3]
let sum = rArr.reduce((pre,cue,index,array) => {
return pre + cur // 1 + 2 + 3 数组求和
})
console.log(rArr) => [1,2,3]
console.log(sum ) => 6
传 initialValue 基础值的示列
let sum_1 = rArr.reduce((pre,cur,index,array) => {
return pre + cur // 10 + 1 + 2 + 3
},10)
console.log(rArr) => [1,2,3]
console.log(sum_1) => 16
##### reduce() ( ES5 )
作用: 从数组的第一项开始,逐步遍历到最后,迭代数组的所有项
参数: callback initialValue
参数说明:
callback迭代函数,有四个参数(pre,cur,index,array)
pre: 前一个值,(initialValue || 数组第一项 || 上一次迭代结果)
cur: 当前迭代项
index: 当前迭代索引
array: 迭代的原始数组
initialValue: 迭代的基础值,不传基础值是数组第一项
返回值: 数组迭代后,数组的迭代结果
原始数组是否改变: 涉及 callback 不确定
let rArr = [1,2,3]
let sum = rArr.reduce((pre,cue,index,array) => {
return pre + cur // 1 + 2 + 3 数组求和
})
console.log(rArr) => [1,2,3]
console.log(sum ) => 6
传 initialValue 基础值的示列
let sum_1 = rArr.reduce((pre,cur,index,array) => {
return pre + cur // 10 + 1 + 2 + 3
},10)
console.log(rArr) => [1,2,3]
console.log(sum_1) => 16
reduceRight() ( ES5 )
作用: 从数组的最后一项开始,逐步遍历到最后,迭代数组的所有项
参数: callback initialValue
参数说明:
callback迭代函数,有四个参数(pre,cur,index,array)
pre: 前一个值,(initialValue || 数组第一项 || 上一次迭代结果)
cur: 当前迭代项
index: 当前迭代索引
array: 迭代的原始数组
initialValue: 迭代的基础值,不传基础值是数组第一项
返回值: 数组迭代后,数组的迭代结果
原始数组是否改变: 涉及 callback 不确定
let rightArr = ['h','e','l','l','o']
let str = rightArr.reduceRight((pre,cue,index,array) => {
return pre + cur // 从后向前拼接字符串
})
console.log(rightArr) => ['h','e','l','l','o']
console.log(str) => 'olleh'
find() ( ES6 )
作用: 查找数组中第一个符合条件的元素,返回该元素
参数: callback thisArg
参数说明: 参数的使用同上述 forEach every map some filter 方法一致
返回值: 查找到则返回该元素,没有找到返回 undefined
原始数组是否改变: 涉及 callback 不确定
let findArr = [1,2,'a',3,4,9,10]
let findRe = findArr.find((item,index,array) => {
return item > 4
})
console.log(findArr) => [1,2,'a',3,4,9,10]
console.log(findRe) => 9
findIndex() ( ES6 )
作用: 查找数组中第一个符合条件的元素所在位置的索引,返回该索引值
参数: callback thisArg
参数说明: 参数的使用同上述 forEach every map some filter 方法一致
返回值: 查找到则返回该索引值,没有找到返回 -1
原始数组是否改变: 涉及 callback 不确定
let findIndexArr = [1,2,'a',3,4,9,10]
let findIndexRe = findIndexArr.findIndex((item,index,array) => {
return item > 4
})
console.log(findIndexArr) => [1,2,'a',3,4,9,10]
console.log(findIndexRe) => 5
fill() ( ES6 )
作用: 用指定的元素,填充数组 从 start(包括) 到 end(不包括)之间的元素,如果该区间内已经有元素,直接替换掉
参数: value startIndex endIndex
返回值: 填充后的数组
原数组是否改变: 是
let fillArr = [1,2,3,4,5]
let fillArr_1 = fillArr.fill('a',2,4)
console.log(fillArr) => [1, 2, 'a', 'a', 5]
console.log(fillArr_1) => [1, 2, 'a', 'a', 5]
includes() ( ES7 )
作用: 判断数组中是否包含指定的元素
参数: searchElement fromIndex
返回值: true or false
原始数组是否改变: 否
let inArr = [1,2,3,4,5,6]
let inArr_1 = inArr.includes(3)
console.log(inArr) => [1,2,3,4,5,6]
console.log(inArr_1) => true
注意: 这个方法弥补了 indexOf 查看 元素时的一个不足,即查找 NaN 误差
let inArr_2 = [1,2,3,NaN,4,5]
let inArr_3 = inArr_2.includes(NaN)
let inArr_4 = inArr_2.indexOf(NaN)
console.log(inArr_3) => true includes 找到了 NaN
console.log(inArr_4) => -1 indexOf 找不到 NaN
toString() 、 toLocalString()( ES7 )
作用: 调用数组每一项的 toString() 方法,返回的是以逗号分隔的字符串
参数: 无
返回值: 转化后的字符串
原数组是否改变: 否
let stringArr = [1,[1,2,[4]],{name:"caixin"},3]
let stringArr_1 = stringArr.toString()
let stringArr_2 = stringArr.toLocalString() ? 报错
console.log(stringArr) => [1,[1,2,[4]],{name:"caixin"},3]
console.log(stringArr_1) => 1,1,2,4,[object Object],3
console.log(stringArr_2) => ? 报错
join()( ES5 )
作用: 将数组作为字符串返回
参数: 分隔符号 默认 为 ,
返回值: 转换后的字符串
原数组是否改变: 否
let joinArr = [1,'c','a','x',2,[1,[2]]]
let joinArr_1 = joinArr.join()
console.log(joinArr) => [1,'c','a','x',2,[1,[2]]]
console.log(joinArr_1) => 1,c,a,x,2,1,2
构造函数的方法
Array.from()
作用: 将类数组转换为数组
参数: arrLike [, mapFn [,thisArg]]
参数说明:
arrLike: 类数组对象,可以是我们常见的 nodeList arguments、字符串、iterable对象等
返回值: 转换后的数组,如果有 mapFn 则返回结果是经过 mapFn 处理的数组
原类数组是否改变: 不使用 mapFn 则类数组不改变。使用 mapFn 则结果同上述迭代方法中使用 callback 的情况一致
let fromStr = 'caixin'
let fromStr_1 = Array.from(fromStr)
console.log(fromStr) => 'caixin'
console.log(fromStr_1) => ['c','a','i','x','i','n']
let fromStr_2 = 'caixin'
let fromStr_3 = Array.from(fromStr_2,(item,index) => {
return item.toUpperCase()
})
console.log(fromStr_2) => 'caixin'
console.log(fromStr_3) => ['C','A','I','X','I','N']
特别注意:
Array.from() 等价于 Array.prototype.slice.call(argument,0)
数组扩展运算符 ( ES6 )

数组的扩展运算符可以将数组转换为以逗号分割的参数序列

将数组通过扩展运算符转换为参数序列直接传参,无需使用apply转换了
let kArr = [1,2,3]
Math.min(...kArr) // Math.min(1,2,3)
apply 写法
Math.min.apply(null,kArr)
可以用于复制数组和拼接数组
let kArr_1 = [1,2,3]
let kArr_2 = ['a','b','c']
consle.log([...kArr_1,...kArr_2]) => [1,2,3,'a','b','c']
可以将字符串分解成真正的数组
let kStr = "caixin"
console.log([...kStr]) => ['c','a','i','x','i',''n]

总结

方法的总结

1、数组的方法无外乎是对数组的增、删、改、查、转换、迭代;增、删、改都会改变原始数组。

2、查、转换的方法不涉及 callback参数 的不会改变原数组,涉及到的则视情况而定。

3、迭代方法因为均会涉及到 callback参数 因此不确定 如果直接在 callback中操作原数组,那原数组肯定会改变;如果不是直接操作原数组,而是操作 callback的item参数时,如果item是基本数据类型则原数组中对应的该项元素不会改变,如果是引用类型则会改变。

4、所有涉及索引的方法,开始位置都是在操作范畴,结束位置都是不包括在操作范围内的。

归类总结

1、按功能归类
创建数组的方法
1new Array()
2let arr = []
3Array.of()
检测数组的方法
1Object.prototype.toString.call([]) === "[object,Array]" => true
2Array.isArray([1,2,3]) => true
常规操作数组
1push()
2pop()
3unshift()
4shift()
5splice()
复制、翻转、排序、拼接、填充数组
1、copyWithin()
2reverse()
3sort()
4concat()
5、slice()
6、fill()
7、扩展运算符 [...Array1,...Array2]
8、valueOf() => 返回数组本身
查找数组项
1indexOf()
2lastIndexOf()
3find()
4findIndex()
5includes()
运行给定函数,判断每一项是否符合条件
1every()
2some()
数组迭代循环 在 callback 里做一些操作
1filter()
2map()
3forEach()
特殊方法 clalback 多个参数 可做一些深入操作
1reduce()
转换为字符串操作
1toString()
2toLocalString()
3join()
将类数组转换为数组
1Array.from()
2、数组扩展运算符 [...String]
语句
for (let i of Array){}
for (let i in Array){}
2、按版本归类
ES5
1、let arr = new Array()
2、let arr = []
3、Object.prototype.toString.call([]) === "[object,Array]"
4push()
5pop()
6unshift()
7shift()
8splice()
9reverse
10sort()
11、concat()
12、slice()
13、indexOf()
14、lastIndexOf()
15、every()
16、some()
17、filter()
18map()
19、forEach()
20、reduce()
21、toString()
22、toLocalString()
23、valueOf() => 返回数组本身
ES6 +
1、Array.of()
2copyWithin()
3find()
4findIndexOf()
5fill()
6includes()
7、Array.from()
8、扩展运算符 [...Array] [...String]
9、for (let i of Array){}
10、for (let i in Array){}
posted @   caix-1987  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示