JS 的数组就是API的调用
一.其他语言的数组的封装(比如Java的ArrayList)
- 为什么js的数组不需要封装,而java的需要封装呢? :因为java中的数组结构相对来说比较底层,而js当中对数组的操作封装的很好
- 常见的语言的数组不能存放不同的数据类型,因此所有在封装时通常存放在数组中的时Object类型
- 常见语言的数组容量不会自动改变(需要进行扩容操作)
- 常见的语言的数组进行中间插入和删除操作性能比较低
- 当其他语言进行中间插入的时候,后面的数据必须先全部一个一个全部往后移动一个位置,空出一个位置后,才能插入数据
- 当其他语言进行删除的时候,还必须把后面的元素全部往前移动一个位置,因为删除了第一个元素,第一个是空的,通过索引0是取不到数据的,而后面的元素又不会动态的补上
所以我们为什么还要使用数组呢?
- 通过下标值取数据的时候,效率非常高,能够直接定位的那个数据,进行修改,和查询
二. 数组API的常见操作
定义一个数组 let numbers =[1,2,3,4,5,6]
添加元素
//在数组的最后一个位置添加元素
numbers.push(11) //1,2,3,4,5,6,11
//在数组的头部位置添加一个元素
for (var i = numbers.length; i > 0; i--) {
numbers[i] = numbers[i-1]
}
numbers[0] = -1
alert(numbers) // -1,1,2,3,4,5,6 (取到最后一个元素的后面一个位置,从后开始,将前面的一个赋值给后面一个,最后就空出头部位置了)
删除元素
// 删除最后的元素
numbers.pop() //1,2,3,4,5
//删除头部的元素
numbers.shift() //2,3,4,5,6
任意位置的删除和修改
//删除 指定位置的几个元素 (几个元素,不是第几个)
numbers.splice(1, 2) //1,4,5,6
//修改 指定位置的几个元素
numbers.splice(1, 2, "a", "b") //1,a,b,4,5,6
这种操作会先删除,在添加写入的元素:先从索引1开始删除两个,在从删除的地方加上a,b两个元素
eg:
numbers.splice(1, 2, "a") //1,a,4,5,6
numbers.splice(1, 3, "a") //1,a,5,6
常见的其他数组方法
concats | 连接两个或者更多数组,并返回结果 |
---|---|
every | 对数组中的每一项运行给定函数,如果该函数对每一项都返回 true ,则返回true , 否则返回false |
filter | 对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组 |
forEach | 对数组中的每一项运行给定函数。这个方法没有返回值 |
join | 将所有的数组元素连接成一个字符串 |
indexOf | 返回第一个与给定参数相等的数组元素的索引,没有找到则返回-1 |
lastIndexOf | 返回在数组中搜索到的与给定参数相等的元素的索引里最大的值 |
map | 对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组 |
reverse | 颠倒数组中元素的顺序,原先第一个元素现在变成最后一个,同样原先的最后一个元素变成了现在的第一个 |
slice | 传入索引值,将数组里对应索引范围内的元素作为新数组返回 |
some | 对数组中的每一项运行给定函数,如果任一项返回 true ,则结果为true , 并且迭代结束 |
sort | 按照字母顺序对数组排序,支持传入指定排序方法的函数作为参数 |
toString | 将数组作为字符串返回 |
valueOf | 和 toString 类似,将数组作为字符串返回 |
数组的合并
// 数组的合并
var nums1 = [1, 2, 3]
var nums2 = [100, 200, 300]
var newNums = nums1.concat(nums2)
alert(newNums) // 1,2,3,100,200,300
迭代方法
every()方法
- every()方法是将数组中每一个元素传入到一个函数中, 该函数返回true/false.
- 如果函数中每一个元素都返回true, 那么结果为true, 有一个为false, 那么结果为false
- every()练习 :
- 判断一组元素中是否 都 包含某一个字符
// 定义数组
var names = ["abc", "cb", "mba", "dna"]
// 判断数组的元素是否都包含a字符
var flag = names.every(function (t) {
return t.indexOf('a') != -1 //indexof方法等于-1为没找到,找到了返回第一个索引
})
alert(flag) //false
some()方法
- some()方法是将数组中每一个元素传入到一个函数中, 该函数返回true/false
- 但是和every不同的是, 一旦有一次函数返回了true, 那么迭代就会结束. 并且结果为true
- some()练习 :
- 判断一组元素中是否 包含某一个字符
// 定义数组
var names = ["abc", "cb", "mba", "dna"]
// 判断数组中是否包含有a字符的字符
var flag = names.some(function (t) {
alert(t)
return t.indexOf("a") != -1
})
alert(flag)
forEach()方法
- forEach()方法仅仅是一种快速迭代数组的方式而已
- 该方法不需要返回值
- forEach的练习
// 定义数组
var names = ["abc", "cb", "mba", "dna"]
// forEach的使用
names.forEach(function (t) {
alert(t)
}) //弹出四次框 ,分别对应数组的每一项
另外三个filter,map,reduce方法在关于js的随笔中有所阐述