数组也是
对象数据类型,也是由键值对组成的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,否则为1array:可选,调用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的方法