1.数组的概念:
- 内存中的多个容器排列起来,组成的一个大容器。
- 数组中的每个小容器都有编号,第一个是0,第二个是1,…
- 咱们把编号叫做下标,来区分每个小容器。
2.数组的创建:
语法一:直接创建
var arr = []; // 创建了一个空数组
var arr = ["张三","李四","王五"]; // 创建了一个数组,里面存了三个姓名
语法二:构造函数方式创建
var arr = new Array(); // 创建了一个空数组
var arr = new Array(3); // 创建了一个长度为3的数组
var arr = new Array("张三","李四","王五"); // 创建了一个数组,里面存了三个姓名
注意:使用构造函数的方式创建数组的时候,如果其中只有一个整数,表示数组的长度;
如果是多个值,代表是数组中的多个值;
如果只有一个值,但不是整数,要报错。
3.数组的获取:
索引:每一个值对应的编号(下标从0开始,依次递增) arr[0]~arr[length-1]
数组名[索引] //第一个元素的下标是0,第二个是1,......
求数组的长度:arr.length
eg:
var arr = ["张三","李四","王五"];
console.log(arr); // (3) ["张三", "李四", "王五"]
console.log(arr[1]); // 李四
console.log(arr[3]); // undefined
4.数组的操作:
数组[下标] = 值;
//如果下标不存在,就是给数组增加元素
//如果下标已经存在,就是将数组中的元素修改
清空数组:
var arr = [1,2,3,4,5];
arr = []; 或 arr.length = 0;
通常,数组中的元素可以是任意类型的数据。一般情况,在数组中的每个元素都是同样的类型,但从语法上来说,数组中的每个元素的类型可以不一样。
var arr = [1,3.14,"Rose",true,null];
console.log(arr); // (5) [1, 3.14, "Rose", true, null]
arr[4] = "Jack"; //将索引为4的null修改为"Jack"
conole.log(arr); // (5) [1, 3.14, "Rose", true, "Jack"]
5.for循环和for in:
//利用for in来遍历的数组:
var arr = [10,20,30,40,50];
for (var i in arr) {
console.log(arr[i]);
}
注意:for in中的i变量类型是字符串,而不是数字类型,所以for in专门用来遍历对象,for in不会遍历空元素
//eg:利用for in 求数组中所有元素的和:
var arr = [10,20,30,40,50];
var sum = 0;
for (var i in arr) {
sum += arr[i];
}
alert(sum);
6.多维数组和稀疏数组:
二维数组 - 数组的嵌套
var arr = [
"Jack",
"Rose",
["王宝强","马蓉"],
["贾乃亮","李小璐"]
];
console.log(arr[编号][编号]);
console.log(arr);
console.log(arr[2]);
console.log(arr[2][1]);
稀疏数组:var arr = [1,2,3,4,,6,,8];
7.数据类型和存储的区别:
1.简单类型/普通类型/基本类型:number、string、boolean、undefined、null、symbol(es6)
简单类型传递值
var num = 11;
var num1 = num;
num = 20;
console.log(num); // 20
console.log(num1); // 11
2.复杂数据类型/引用类型:对象、数组、函数(Object、Array、function)
引用类型传递地址
var obj = {
name:"zs",
age:18
}
var obj1 = obj;
obj1.name = "ls";
console.log(obj.name); // ls
console.log(obj1.name); // ls
栈和堆:
栈中存储基本类型的值,堆中存放复杂类型的值
- 栈:先进后出
- 队列:先进先出
- 堆:随机分配
8.数组的API:
方法名 | 用法 | 语法 |
---|---|---|
push | 末尾添加元素 | 数组.push(被添加的值) //返回修改的长度//改变原数组 |
unshift | 开头添加元素 | 数组.unshift(被添加的值) |
pop | 末尾删除一个元素 | 数组.pop() |
shift | 开头删除一个元素 | 数组.shift() |
splice | 给数组添加或删除元素 | 数组.splice(开始下标) // 删除包含开始下标以后的元素数组.splice(开始下标,删除个数) // 删除固定个数数组.splice(开始下标,0,要添加的元素) // 添加数组.splice(开始下标,删除个数,新的元素) // 将数组中的元素删除,再放一个新的元素代替(新的元素可以是多个,用逗号隔开) |
reverse | 数组的翻转 | 数组.reverse() |
concat | 数组的拼接 | 数组.concat(要拼接的值) // concat方法不改变原数组,需要使用新的变量接收最后的结果 var rest = 数组.concat(要拼接的值)// concat可以拼接多个值// concat可以将拼接的数组变成一个一个的值,拼在一个数组中 |
slice | 数组的截取 | 数组.slice(开始下标,结束下标) // 结果:包含头,不包含尾// 第一个参数不可以省略;第二个参数可以省略,第二个参数省略代表从开始位置截取到数组末尾// 两个下标可以是负数,负数下标就是从数组末尾开始往前数// 两个参数相等为空 |
join | 将数组拼接成一个字符串 | 数组.join(“连接符”) //将数组的每一个值使用连接符连成一个字符串// 连接符:指定要使用的分隔符。如果省略该参数,则使用逗号(,)作为分隔符。 |
sort | 数组的排序默认是按ASCII排序 | 数组.sort() // 默认从小到大排列包含多位数字排序时:数组.sort(function(a,b){ return a - b;//从小到大排序}) |
9.冒泡排序和选择排序:
//冒泡排序 - 相邻两个元素进行比较,将一个数组中的数字使用循环进行升序或降序的排列
for( var j=0; j<arr.length-1; j++){
for(var i=0;i<arr.length-j-1;i++){
if( arr[i] >arr[i+1] ){ //如果 前一个>后一个,就交换位置
var a = arr[i];
arr[i] = arr[i+1];
arr[i+1] = a;
}
}
}
//选择排序 - 先找最大值或最小值,放到最合适的位置;然后在剩下的数字中找最大值或最小值,再排到合适的位置
for( var j=0; j<arr.length-1; j++){
for(var i=1;i<arr.length;i++){
if( arr[j] >arr[i] ){
var a = arr[j];
arr[j] = arr[i];
arr[i] = a;
}
}
}
快速排序(递归、数组的方法)
//思路:splice/push/concat
//待排序的数组中任意截取一位(自由选择,取中间)--splice
//用数组中剩下的值和取出的值进行比较,如果小于取出的值,放到一个数组(left),大于同样放入一个数组(right) -- push
//采用同样的方式,分别对left和right重复上面的步骤。--递归
//一旦数组的长度<=1,拼接数组 - concat
var arr = [12, 9, 3, 12, 456, 12, -100, 9, 7, 39, 25];
function quicksort(arr) {
if (Array.isArray(arr)) {//数组
//设置基点
if (arr.length <= 1) {
return arr;
}
var midIndex = parseInt(arr.length / 2);//获取中间值的索引
var midValue = arr.splice(midIndex, 1)[0];//获取中间值,改变原数组
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] < midValue) {
left.push(arr[i]);
} else if (arr[i] > midValue) {
right.push(arr[i]);
}
}
return quicksort(left).concat(midValue, quicksort(right));//递归调用
} else {//不是数组,抛错
throw new Error('你输入的不是数组');
}
}
console.log(quicksort(arr))