数组也是
对象数据类型
,也是由键值对组成
的1、以数字作为索引(属性名),
索引从0开始递增
2、有一个
length
的属性存储的是数组的长度数组中每一项都可以是任何数据类型
arr[0] 获取第一项
arr[arr.length-1] 获取最后一项
splice
改变、slice
查找
1.1-1.4
新增返回长度,删除返回删除项
slice
参数都是索引值
1 | var arr=[12,12,15] |
数组中的常用方法
按照四个维度记忆:
- 方法的作用
- 方法的参数
- 方法的返回值
- 原有数组是否改变
push
作用:向数组“末尾”追加
新的内容
参数:追加的内容(可以是一个,也 可以是多个)
返回值:新增后数组的长度
原有数组:改变
1 | var arr=[12,23,42] |
pop
作用:删除数组最后一项
参数:无
返回值:被删除的那一项内容
原有数组:改变
1 | var arr=[12,23,42] |
unshift
作用:向数组开始位置追加
新内容
参数:要新增的内容
返回值:新增后数组的长度
原有数组:改变
1 | var arr=[12,23,42] |
shift
作用:删除数组第一项
参数:无
返回值:被删除的那一项内容
原有数组:改变
shift()
删除第一项以后,原有后面每一项
的索引都向前减一
1 | var arr=[12,23,42] |
splice(n,m,x...)
: 改变
,起始位置n
后面的m
个,包含第n个
的m个内容
1、删除arr.splice(n,m)
从索引n
开始(包含第n个),删除m
个内容,
返回值:把删除的部分以一个新数组返回
,
原有数组:改变
如果不指定m
,或者删除的个数大于最大长度,都是删除到数组的末尾
1 | var arr=[12,23,34,45,56,78] |
2、 增加内容arr.splice(n,0,x...)
从索引n
开始删除0项
(没删除),把X
或者更多需要插入的内容放到数组中n
的前面
返回值是空数组 [] (因为一项也没删除)
1 | var arr=[12,23,42] |
3、修改arr.splice(n,m,x...)
修改的原理:把原有内容删除掉,然后用新的内容替换掉这部分内容
返回值:把删除的部分以一个新数组返回,
1 | var arr=[12,23,34,45,56,78] |
slice(n,m)
:查找
,起始位置到结束位置,包含第n项
、不包含第m项
作用:在一个数组中,按照条件查找出其中的部分内容
参数:两个参数(n,m)
(n和m都是索引
,m不代表向后查几项)从索引n开始找到索引m处(包含第n项不包含第m项
)
返回值:以一个新数组存储查找的内容
原有数组:不改变
m不写查找到最后一项
数组克隆:n写0
,m不写
, 或者mn都不写
; 和原有数组一样,但是不是相同的堆内存空间,两个数组不相等,相互独立
,遇到非基本类型只是简单赋值引用,所以是 浅拷贝
支持负数:用总长度加上负数来进行索引,n要比m小
1 | var arr=[12,23,34,45,56,67,78,89,90] |
concat
作用:实现多个数组(或者值)的拼接
参数:数组或者值
返回值:拼接后的新数组
原有数组:不改变
1 | var arr=[12,23] |
toString
作用:把数组转化为字符串
参数:无
返回值:数组中的每一项用逗号分隔的字符串
原有数组:不改变
1 | var arr=[12,23,42] |
join('xx')
,把数组转化为字符串
作用:和toString类似,把数组转化为字符串
,但是我们可以设置变为字符串后,每一项之间的连接符
参数:指定的连接符
返回值:数组中的每一项用指定的连接符分隔的字符串
原有数组:不改变
不写连接符或者写为’,’跟toString一样
基于join实现数组求和:1、
join('+')
2、eval
:把字符串变为JS表达式执行,得到的是数组每一项的和
1 | var arr=[12,23,42] |
reverse
作用:把数组倒过来排列
参数:无
返回值:排列后的数组
原有数组:改变
1 | var arr=[12,23,42] |
sort
作用:给数组排序
参数:无/函数
返回值:排序后的新数组
原有数组:改变
sort不传递参数时,只能处理10以内的排序
return a-b; //升序
return b-a; //降序
1 | //sort不传递参数时,只能处理10以内的排序 |
indexOf / lastIndexOf(值)
这两个方法不支持IE低版本浏览器(IE6,7,8)
作用:检测当前值在数组中第一次或者最后一次出现位置的索引,如果没有返回-1
参数:要检测的值
返回值:索引
原有数组:不改变
基于indexOf检测,如果数组中有这一项,返回大于等于0的索引
1 | var arr=[12,23,42,51] |
arr.forEach(function(currentValue, index, arr){},thisArg)return不是必须的
不支持IE 6-8
作用:循环调用数组的每个元素,并将元素依次传递给回调函数
参数:
1、回调函数function(currentValue, index, arr){}:return不是必须的
currentValue
:当前元素;index
:可选,当前元素的索引值;arr
:可选,forEach()
方法正在操作的数组。不会对空数组进行检测
2、 thisArg:可选参数。当执行回调函数时用作 this 的指向(参考对象)
返回值:无
原有数组:不改变
1 | var sum = 0; |
array.map(function(currentValue,index,arr){},thisValue)必须有return
作用:从左到右依次调用处理函数,返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值
不会对空数组进行检测
参数:
1、 处理函数:必须有return
,数组中的每个元素都会执行这个函数
currentValue
必须 当前元素的值index
可选 当前元素的索引值arr
可选 当前元素属于的数组对象
2、 thisValue
可选 对象作为该执行回调时使用,传递给函数,用作 “this” 的值
如果省略了 thisValue
,或者传入 null、undefined
,那么回调函数的 this 为全局对象
返回值:一个新数组,数组中的元素为原始数组元素调用函数处理后的值
,’与原素组相比 每一项都变了’
原有数组:不改变
1 | var numbers = [65, 44, 12, 4]; |
map与 parseInt结合 参考:
js基础2、parseInt():转化为整数
1 | let arr=[1,2,3] |
arr.reduce(function(accumulator,currentValue,currentIndex,array){}, initialValue)
计算、汇总、收敛需return
作用: 对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值
参数
1、callback参数:需return
accumulator
:累计器
,累计回调的返回值; 它是上一次调用回调时返回的累积值
,或initialValue
(见于下方)currentValue
:数组中正在处理的元素
currentIndex
:可选,数组中正在处理的当前元素的索引
。 如果提供了initialValue
,则起始索引号为0
,否则为1
array
:可选,调用reduce()
的数组
2、initialValue
:作为第一次调用 callback函数时的第一个参数的值
。 如果没有提供
初始值,则将使用数组中的第一个元素
在没有初始值的空数组上调用 reduce
将报错
如果数组仅有一个元素(无论位置如何)并且没有提供initialValue, 或者有提供initialValue但是数组为空,那么此唯一值将被返回并且callback不会被执行
返回值:函数累计处理的结果(返回的永远都是最后运算的结果
)
上次执行的结果会成为下一次的初始值
1 | let arr=[1]; |
示例
计算数组中每个元素出现的次数:
将initialValue(初始值)设置为对象{},判断空对象中是否存在
acc初始值是指为了
{}
空对象;为累计器,累计回调的返回值
1 | var arr=[1,2,3,4,5,6,1,1,2,4,5]; |
数组去重:
arr.sort
先将重复的放在一起,所以只要重复 init[init.length-1]
init最后一个肯定和下一个相等
1 | let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4]; |
多层嵌套对象通过数组取值:
将取值对象传入当做初始值
1 | let json={ |
reduceRight 就是 reduce从右往左算
index 逐渐减小直至0
array.find(function(currentValue, index, arr){},thisValue)
返回条件成立
的数组的第一个元素的值
IE 11 及更早版本不支持 find() 方法,
一般用于手机端
作用:从左到右依次调用条件,返回条件成立
的数组的第一个元素的值
,只找第一个
,之后的值不会再调用执行函数;没有符合条件的元素返回 undefined
;不会对空数组进行检测
参数:
1、执行的函数:必须返回条件值
currentValue
必须 当前元素的值index
可选 当前元素的索引值arr
可选 当前元素属于的数组对象;
2、 thisValue
可选 对象作为该执行回调时使用,传递给函数,用作 “this” 的值
返回值:返回条件成立的数组的第一个元素的值
原有数组:不改变
1 | var ages = [3, 10, 18, 20]; |
array.findIndex(function(currentValue, index, arr), thisValue)
返回数组中条件成立
的第一个元素的索引
array.filter(function(currentValue,index,arr){},thisValue)
返回条件成立的数组的所有元素
组成的新数组
IE 9 以前不支持 filter() 方法
作用:从左到右依次调用条件,返回条件成立的数组的所有元素
组成的新数组,如果没有符合条件的元素则返回空数组
;不会对空数组进行检测
参数:
1、 回调函数:必须有return
currentValue
必须 当前元素的值index
可选 当前元素的索引值;arr
可选 当前元素属于的数组对象;
2、 thisValue
可选 对象作为该执行回调时使用,传递给函数,用作 “this” 的值
如果省略了 thisValue
,”this” 的值为 “undefined”;
返回值:返回数组,包含了符合条件的所有元素。如果没有符合条件的元素则返回空数组
原有数组:不改变
1 | function isBigEnough(element) { |
arr.fill(value)
把数组的所有值都改写为value
1 | var arr = [3, 10, 18, 20]; |
arr.some(function(item){})
只要有一个符合条件的元素就行
1 | var arr = [3, 10, 18, 20]; |
arr.every(function(item){})
每一个元素都必须符合条件才行
1 | var arr = [3, 10, 18, 20]; |
Array.from(arrayLike, mapFn, thisArg)
将类数组转化为数组
arrayLike
:想要转换成数组的伪数组对象
或可迭代对象
伪数组对象:(拥有一个 length 属性和若干索引属性的任意对象)
可迭代对象:(可以获取对象中的元素,如 Map和 Set 等)
mapFn
(可选参数):如果指定了该参数,新数组中的每个元素会执行该回调函数
thisArg
(可选参数):可选参数,执行回调函数 mapFn 时 this 对象
返回值:一个新的数组实例
1 | //字符串 |
Array.of(items)
创建数组
1 | let arr=Array.of(1) |
还有很多:
- includes
- keys
- ….
数组 类数组的区别:
数组
的__proto__
指向Array
,所以能用Array
的方法(push等)类数组
的__proto__
指向Object
,所以不能用Array
的方法(push等)数组
属于Array
的一个类,类数组
直属于Object
的一个类不能用Array的方法