// 关于JS数组常用方法的剖析
// 数组也是对象数据类型的,也是由键值对组成的
```javascript
var ary = [12,23,34];
/*
* 结构:
* 0:12
* 1:23
* 2:34
* length:3
*/
1.以数组作为索引(属性名),索引从零开始递增
2.有一个LENGTH属性存储的是数组长度
ary[0] 获取第一项
ary[ary.length-1] 获取最后一项
```
// 数组中的每一项的值可以是任何数据类型的
```javascript
var ary = [
{
name:'xxx',
age:20
},
{
name: 'xxx',
age: 12;
}
];
// 数组中常用方法
> 按照四个维度记忆:
> -方法的作用
> -方法的参数
> -方法的返回值
> -原有数组是否改变
### "push"
作用:向数组”末尾“追加新的内容
参数:追加的内容(可以是一个,也可以是多个)
返回值:新增后数组的长度(length)
原来数组改变
```
var ary = [12,23,34];
ary.push(100);
```
### "pop"
作用:删除数组最后一项
参数:无
返回值:被删除是我那一项内容)
原来数组改变
```
var ary = [12,23,34];
ary.pop()
```
### "shift"
作用:删除数组中的第一项
参数: 无
返回:被删除的那一项内容
原有数组改变
```
// 基于shift删除数组中的第一项,第一项被删除后,原有后面每一项的索引都要向前减1
var ary = [12,23,34];
ary.shift()
```
### "unshift"
作用:向数组开始位置追加新内容
参数: 新增的内容
返回:新增后数组的长度(length)
原有数组改变
```
// 基于unshift新增数组中的第一项,第一项新增后,原有后面每一项的索引都要向后加1
var ary = [12,23,34];
ary.unshift(11,true)
```
### "splice"
基于SPLICE作用可以对数组进行很多操作:删除指定位置的内容,向数组指定位置增加内容,还可以修改指定位置信息
删除:ary.splice(n,m)
作用:从索引n开始,删除m个内容
参数:ary.solice(n,m)
返回:把删除的部分以一个新数组返回
原有数组改变
```
var ary = [12,23,34,45,56,67,78,89,90];
ary.splice(2,3) //[34,45,56]
ary.splice(2) //[34,45,56,67,78,89,90];
// 如果不指定m,或者删除的个数大于最大长度,都是删除到数组末尾
```
增加:ary.splice(n,0,x,...)
作用:从索引n开始删除零项(没删除),把X或者更多需要插入的内容存到数组中索引N的”前面“
参数:ary.splice(n,0,x,...)
返回:一个空数组[]
原数组有变换
原理:把原有内容删除掉,然后用新的内容替换这部分信息即可
```
var ary = [12,23,34,45,56,67,78,89,90];
ary.splice(2,3) //[34,45,56]
ary.splice(2)
```
// 删除数组最后一项由几种方法
var ary = [12,23,34,45,56,67,78,89,90];
1).ary.pop()
2).ary.splice(ary.length-1)
3).ary.length--
4).delete ary[ary.length] //不建议基于delete删除数组中的某一项,虽然内容没有了,但是数组的length长度没有改变
// 向数组末尾追加新内容
var ary = [12,23,34,45,56,67,78,89,90];
1).ary.push(100)
2).ary.splice(ary.length,0,100)
3).ary[ary.length] = 100;
### 'slice'
作用:在一个数组中,按照条件查找出其中的部分内容
参数:两个参数(n/m) slice(n,m) 从索引n开始,找到索引m处,但不包含m
返回:以一个新数组存储查找的内容
原有数组不会改变
```
var ary = [12,23,34,45,56,67,78,89,90];
ary.slice(0) || ary.slice() // 数组克隆(克隆后的地址与原来的地址不一样)
特点: 如果不写m,则查找到数组末尾
ary.slice(0) || ary.slice() 实现数组的克隆,克隆一个新的数组出来,和原来的数组内容一样,但是不是相同的堆内存空间,两个数组是不相等对立的(浅克隆)
支持负数索引,负数运算规则,数组总长度+负数索引
```
### 'concat'
作用:实现多个个数组(或者值)拼接
参数:数组或者值
返回:拼接后的新数组
原来数组不变
```
var ary1 = [12,23];
var ary2 = [100,200];
var ary3 = [1000,2000];
ary1.concat(ary2,"珠峰",ary3)
可以基于空数组作为拼接的开始,在小括号中排列拼接的顺序,空数组不会占据内容的位置
```
### 'toSting'
作用: 把数组转换为字符串
参数:无
返回:数组中的每一项用逗号分隔的字符串
原有数组不会改变
```
var ary1 = [12,23];
ary.toString();
```
### 'join'
作用:和toString类似,也是把数组转换为字符串,但是我们可以设置变为字符串后,每一项之间的连接符
参数:指定的连接符
返回: 字符串
原数组不变
```
var ary1 = [12,23];
ary.join("+"); '12+23'
eval(ary.join("+")) // 35
// eval() eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码
eval('12+13px') //报错
eval('12+true') //13
eval('12+false') //12
eval('12+null') //12
eval('12+undefined') //NaN
eval('12+[]') //"12"
eval('12+{}') //"12[object Object]"
基于join我们可以实现数组中的每一项求和的功能
1.基于join,使用+作为分隔符,先把数组变为每一项相加的字符串
2.基于eval,把字符串变为js表达式执行,得到的结果就是数组中每一项的累加和。
```
### "reverse"
作用:把数组倒过来排序
参数:无
返回:排列后新数组
原有数组改变
```
var ary = [12,23];
ary.reverse() //[23,12]
```
### "sort"
作用:给数组排序
参数:无/函数
返回:排序后的新数组
原有数组改变
```
var ary = [12,23,34,45,56,67];
ary.sort()
sort在不传递参数的情况下,只能处理10以内的数字排序
var ary = [18,1,23,27,35,3,56];
ary.sort() // [1,18,23,27,3,35,56];
// =>真实项目中,基于sort排序,我们都需要传递参数
var ary = [18,1,23,27,35,3,56];
ary.sort(function(a,b){
return a-b; //升序
return b-a; //降序
})
```
### 'indexOf/lastIndexOf'
这两个方法不兼容IE低版本浏览器(IE6-8)
作用:检测当前值在数组中第一次或者最后一次出现位置的索引
参数:要检测的值
返回:索引
原有数组不变
```
var ary = [12,23,34,45];
ary.indexOf(34) //2
ary.indexOf(100) //-1
基于indexOf检测,如果数组中有这一项,返回一个大于等于零的索引,如果没有这一项,返回的索引为-1
```
console.log(Array.prototype)可以看见数组的所有方法