数组
一、数组是什么?
数组从字面意思来看是数据的集合 其中的数据就是基本数据类型和引用数类型集合就是,把有顺序的放在一个盒子里面。
所以数组就是把一些数据按照顺序放在一个盒子里面 比如:[1,2,“hello”]
1.如何创建一个数组
有两种方法:用字面量或者内置的构造函数来创建一个数组
①. 字面量创建一个数组
var arr = [];
var arr2 = [1,2,"hello"];
②. 内置的构造函数创建一个数组
//如果是一个值并且是number类型,则表示创建一个数组,这个值就是数组的长度
var arr = new Array();//创建一个空数组
var arr2 = new Array(4);
//如果是多个值或者是一个字符串,则表示创建一个数组,里面就是这几个值
var arr 3 = new Array("4");//创建一个数组,里面有一个元素,就是'4'
var arr4 = new Array(4,2);
2.数组的索引和length
数组里面每个数据都对应一个编号,这个编号就叫做索引,索引是从0开始的。
要注意一点:整个数组其实就是一个整体,一个数组就是一个变量
如果想获取其中某个索引对应的数据,语法则是:数组[索引]
如果想修改其中某个索引对应的数据,语法则是:数组[索引] = 值
如果想获取数组里面有多少(长度)元素,语法则是:数组.length
如果想末尾新增其中某个索引对应的数据,语法则是:数组[数组.length] = 值
数组中第一个数据是:数组[0]
数组中最后一个数据是:数组[数组.length-1]
二、数组的存储
众所周知,数组是一个引用数据类型,而基本数据类型和前者的区别有很大一部分是因为存储上的不同
基本数据类型和引用数据类型在存储上的区别
内存主要是分为栈内存和堆内存
在存储的时候基本数据存在栈内存,引用数据类型则是存储在堆内存。
而且在基本数据类型变量名里面存储的是值,引用数据类型的变量名里面存储的是地址。
基本数据类型和引用数据类型在比较上的区别
基本数据类型比较的是值 引用数据类型比较的是地址
基本数据类型和引用按数据类型在赋值上的区别
基本数据类型在赋值的时候 是把变量里面的值赋值给另一个变量,然后两个变量就没有关系了
引用数据类型在赋值的时候 是把变量里面的地址赋值给另一个变量,然后两个变量就会相互影响了
基本数据类型和引用按数据类型在作为实参时的区别
同基本数据类型和引用按数据类型在赋值上的区别
三、数组的常用方法
数组的方法有很多,很难全部记下来,而且有的方法不会经常使用,还有一定的兼容性。但是下面九种数组的常用方法,需要重点记忆,因为以下方法都没有兼容性
- push:末尾添加多个元素
作用:将一个或者多个元素添加到数组的末尾
语法:arr.push(element1,…,elementN)
参数:被添加到数组末尾的元素
返回值:该数组的新长度
- unshift:开头添加多个元素
作用:将一个或多个元素添加到数组的开头
语法:arr.unshift(element1, …, elementN)
参数:被添加到数组开头的元素
返回值:该数组的新长度
- pop:删除最后一个元素
作用:从数组中删除最后一个元素
语法:arr.pop()
参数:无
返回值:被删除的元素的值
- shift:删除第一个元素
作用:从数组中删除第一个元素
语法:arr.shift()
参数:无
返回值:被删除的元素的值
- splice:从中间增删改元素
作用:删除或替换现有元素或者原地添加新的元素来修改数组
语法:array.splice(start[, deleteCount[, item1[, item2[, …]]]])
参数:
– start表示从哪个索引开始删除或替换
– deleteCount表示要删除几个元素,如果省略表示删除start后面的所有数据
– item1,…itemN表示替换成的几个元素
返回值:被删除的元素组成的一个数组
- reverse:元素位置颠倒
作用:将数组中元素的位置颠倒
语法:arr.reverse()
参数:无
返回值:倒序后的数组
- sort:元素排序
作用:将数组元素进行排序
语法:arr.sort()
参数:是一个函数,这个函数是一个排序规则,如果省略,表示按照字符串编码顺序排序
返回值:排序好的数组
- concat:合并数组,产生新数组
作用:合并两个或者多个数组
语法:arr.pop()
参数:无
返回值:产生一个新数组
- join:元素拼接
作用:把数组里面的元素拼接在一起
语法:arr.join([separator])
参数:separator表示分隔符,不写表示用逗号分隔
返回值:拼接形参的一个字符串
四、ES5数组常用方法
1.forEach:进行数组遍历
var arr = [1000,2000,3000,4000,3000,5000];
arr.forEach(function(val,index){
console.log(val,index);
})
2.map:进行数组的遍历 返回一个新数组
var arr = [1,2,3,4,5,6,7];
var result = arr.map(function(value){
return value*1.5;
})
console.log(result)
3.filter 进行数组的遍历 返回一个过滤之后的新数组
var arr = [1000,2000,3000,4000,3000,5000];
var result = arr.filter(function(value,index){
return value>=3000;
})
console.log(result)
4.indexOf 用于从前到后查找数组中某一个元素的索引 找到了返回该元素的索引值,反之返回-1
5.lastIndexOf 用于从后到前查找数组中某一个元素的索引 找到了返回该元素的索引值,反之返回-1
var arr = [1000,2000,3000,4000,3000,5000];
console.log(arr.indexOf(3000));
console.log(arr.indexOf(1000));
console.log(arr.indexOf(1));
console.log(arr.lastIndexOf(3000));
console.log(arr.lastIndexOf(1000));
console.log(arr.lastIndexOf(1));
6.扩展:every,some,reduce
every:测试一个数组内的所有元素是否都能通过某个指定函数的测试。它返回一个布尔值。空数组返回true
some:测试数组中是不是至少有1个元素通过了被提供的函数测试。它返回一个布尔值。空数组返回false
reduce:对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。
var arr = [1,2,3,4,5];
var result = arr.every(function(value,index){
return value>3000;
})
console.log(result)
var result = arr.some(function(value,index){
return value>3000;
})
console.log(result)
var result = arr.reduce(function(acc,cur){
return acc+cur;
})
console.log(result)
## 五、冒泡排序
冒泡排序是一种非常基础的排序方法,其原理就是从把一个数组中的每一个数从前往后依次进行比较,然后根据大小交换位置,每一轮的比较都确定出一个当轮比较的最大值,最终实现数组的大小排序。下面用js代码实现一下。
1.创建一个乱序的数组
var arr = [1,5,8,6,4,9,2,3,7];
2.然后遍历一个数组,让挨着的两个进行比较
for (var i = 0; i < arr.length-j; i++) {
if (arr[i] > arr[i + 1]) {
var temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
3.需要进行arr.length次比较,用一个嵌套循环实现,下面是完整代码。
// var num = 0;
var arr = [1, 5, 8, 6, 4, 9, 2, 3, 7];
for (var j = 1; j <= arr.length-1; j++) {
for (var i = 0; i < arr.length-j; i++) {
// num++;
if (arr[i] > arr[i + 1]) {
var temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
console.log(arr)
// console.log(num)