写在前面的话
- 最近有学习一些新东西,但是在学习新东西的同时,对很多基础的知识也是不能忽略的,经常用还好,一旦不怎么常用了,会渐渐生疏,当然,本文的数组是常用的,但是相较于其他强类型的语言来说,JavaScript的数组就太“自由”了,但是注意一点就是万变不离其宗,虽然“自由”很多,但是其本身的语法也会对其有相应的限制(坑多),因此小结了本文,以备后续的查看,复习。当然,文中尚且有不足之处,还请留言提出,以便交流,学习进步。谢谢!
数组的概念
- 数组是指的数据的有序列表。
- 同一个数组中, 元素的类型不做任何限制。
特点
- 数组的长度可以动态改变
- 同一个数组可以存储不同的数据类型
- js变量是没有类型的
数组的创建
- 数组字面量[数组的元素]
- 使用构造函数
- 1、当用构造函数创建数组对象非的时候,如果只传递了一个整数,那么这个整数表示了要创建的数组的长度,其他情况都是表示数组中初始化的元素。
var arr3 = new Array(5);
console.log(arr3.length);//1
- 2、使用构造函数创建数组对象的时候,new可以省略。
var arr4 = Array("a","b");
console.log(arr4);
访问数组的方式:
- 使用数组中元素下标(index)
- 数组中每个元素都有一个下标
- 元素从0 – length-1
js中的数组是可以动态的改变。
- 1、可以给最后一个元素赋值,来增加数组的长度。
- 2、直接更改length的值,也可以改变数组的长度。
- 如果更改的length的值小于最初,则会把多余的元素从数组中移除。
- 稀疏数组
var arr = [10, 20];
arr[10] = 100;
arr[20] = 200;
数组的遍历
- 1、普通的for
for(var i = 0, len = arr.length; i < len; i++){
arr[i]
}
- 2、for in 可以遍历数组。 主要是用来遍历对象的属性。
for(var i in arr){ //i一定是代表了索引 arr指的是要遍历的元素
console.log(i + " " + arr[i]);
}
- 3、es5:forEach 每个数组给添加了一个方法,可以去遍历数组中的元素。
- forEach:专门去遍历一个数组
- 匿名函数称之为回调函数
arr.forEach(function(element, index){ //参数1:元素 参数2:索引
//代码
});
数组常用的方法
转化方法
1、toString()
2、join(连接符字符串) //参数就是
栈方法
- 栈结构 FILO
- push();push的时候,可以一次性的添加多个元素。入栈一个元素,这个元素会成为最后一个元素。方法的返回值:最新的元素个数。
- pop();从数组中出栈一个元素。是数组中的最后一个元素,返回值就是出栈的那个元素。
模拟队列
- FIFO(first in first out)
- shift:删除队首的元素(下标为0的元素)
- unshift:向数组的最前面添加元素(可以多个)
数组的一些其他方法
- 1、元素的倒置:reverse
- 倒置数组中的元素。更改数组本身。
- 2、查找元素的索引
- 如果在数组中找不到,则返回-1;
- arr.indexOf(item); //返回从前面查找item第一次出现的下标
- arr.lasrIndexOf(item); //从后面开始查找item第一次出现的位置
- indexOf(item, fromBack): 从第二个参数的位置开向后始查找 item 第一次出现的位置
- lastIndexOf(item, fromForward): 从第二个参数的位置开始向前查找 item 第一次出现的位置
得到新数组的方法
1、数组的连接
- arr1.concat(arr2) 把arr2连接到arr1,返回连接后的新数组,注意:不会更改arr1.
- arr1.concat(arr2) 把arr2连接到arr1,返回连接后的新数组,注意:不会更改arr1.
2、截取数组
- slice(start, end) 不会修改原数组
- start:截取的开始位置(包括)
- end:结束的位置(不包括),可以省略,省略后表示一直截取到结尾。
- start 和 end 是支持 负数的 。 -1 代表最后一个元素。end必须大于start。
3、向数组或从数组中添加或删除元素
- splice(index, count); 参数1:开始删除的下标,参数2:删除的个数;返回删除的那些元素。会更改原数组。
- 插入的时候第二个参数一般设置为0. arr1.splice(1, 0,”指令”, “fengjie”);
- 替换:用指定的元素去替换 从参数1 开始的 参数2 的arr1.splice(1, 1,”指令”, “fengjie”);//把1的位置删掉,然后再在1的位置添加
数组的排序
- 1、冒泡
- 相邻的两个元素进行比较,只要碰到前面的大于后面的就进行交换。
var arr = [1, 10, 3, 20, 2, 4, 0, 5, 56, 88];
for(var j = 0; j < arr.length - 1; j++) { //循环次数表示参与排序的元素的个数
for(var i = 0; i < arr.length - 1 - j; i++) { //减1为了保证参与的排序的元素下标不会超过length -1,减j是了避免比较过的元素再参与比较,提高效率
if(arr[i] < arr[i + 1]) {//降序
var temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
console.log(arr);
- 2、选择
- 先选择一个元素最为小的或者最大的,然后再与气体元素进行比较。
var arr = [1, 10, 3, 20, 2, 4, 0, 5, 56, 88];
//选择 效率更高
/*for(var i = 0; i < arr.length - 1; i++) {
var minIndex = i;//记录最小的位置的下标
for(var j = i + 1; j < arr.length; j++) { //选择了i为最小的,从i+1开始比较
if(arr[minIndex] > arr[j]) {
minIndex = j; //先记录位置
}
}
//minIndex 就是最小的那个元素
if(minIndex != i) { //比较完一轮后就交换数据
var temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}*/
//选择 效率更低,比较后直接交换
/*for(var i = 0; i < arr.length - 1; i++){
for(var j = i + 1; j < arr.length; j++){
if(arr[i] > arr[j]){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}*/
console.log(arr);
数组自带的排序方法
- arr.sort(); 默认排序规则是按照字母表顺序来排。
- 数组中的元素都会转成string之后,再按照字母表顺序来排。
- arr.sort(function) //function 叫比较函数
arr.sort(function(a, b){
/*
返回值必须是整数:
如果返回值 > 0 就认为 a > b a在b右边
=== 0 a === b
< 0 a < b a在b左边
*/
/* if(a > b){
return 1;
}else if(a === b){
return 0;
}else{
return -1;
}
//降序就1变-1,-1变1
*/
return a - b;//升序:
// return b - a;//降序:
});
数组的检测
- instanceof:检测某个对象是不是属于某个类型。结果是true或者false。
- Array.isArray(arr); 参数就是要检测的那个数组。结果是true或者false。
- 在js中只有值传递。
- 1、简单类型的话,传递的就是那个值的一个copy
- 2、如果是对象类型,传递的是那个对象的地址值的copy
二维数组
- js中没有真正的二维数组
- 一维数组中的元素是一维数组的时候,就是二维数组。