数组
1. 什么是数组: 数组是存储1个或多个数据的容器,它是一组内存空间。 通常用来批量处理数据, 这组内存空间的名字,叫做数组名。
2. 数组是个不挑食的家伙,对其自身储存的数组元素并没有什么限制,无论是数量还是类型,通过数组下标(从0开始)来管理数组元素,不能直接通过数组名来操作数组元素,需要结合下标。
3. 数组名.length: 表示的是数组的长度,也是数组当前存储元素的个数,因为下标从0开始,所以数组长度-1表示数组内最后一个元素的下标。
< script>
创建一个数组
//传统写法
var arr = new Array();
var str = new String();
//字面量(语法糖)
var arr = [1,2,3,"haha"];
console.log(arr);
//访问数组
// 访问单个元素
console.log(arr[0]);
//访问全部元素
//数组和循环的结合使用
for(var i = 0; i < arr.length; i++){
console.log(arr[i]);
}
< /script>
循环访问数组时(遍历),容易出现数组越界的问题,一旦出现,会很麻烦;
数组越界: 访问了不属于该数组的内存空间
数组的方法:
(1)push: 将一个元素添加到数组的最后一位
< script>
var arr = [1,2,3,"haha"];
var xixi = "咦嘻嘻";
arr.push(xixi);
arr.push("今天天气很不错");
console.log(arr);
< /script>
(2)unshift: 添加到数组的第一位
< script>
var arr = [1,2,3,"haha"];
arr.unshift("今天是个好天气");
console.log(arr);
< /script>
(3)pop(): 删除数组最后一个元素
< script>
var arr = [1,2,3,"haha"];
arr.pop();
console.log(arr);
< /script>
(4)shift: 删除数组第一个元素
< script>
var arr = [1,2,3,"haha"];
arr.shift();
console.log(arr);
< /script>
返回 数组中指定的范围
slice(开始,结束) : 截取数组中的指定范围,并将其返回 (需要多次使用就定义新数组来接收)
注意点: 从开始位置,到结束位置的前一位, 是指定的范围
< script>
var arr = [1,2,3,"haha"];
var arr2 = arr.slice(0,2);
console.log(arr2);
console.log(arr.slice(0,3));
< /script>
splice(开始的位置,修改的长度) :
删除:只规定了开始位置和修改的长度,但是没有规定新的内容
替换: 规定了开始位置和修改长度,也规定了新的内容
插入: 新内容的个数,多于修改的长度
< script>
var arr = [1,2,3,"haha"];
arr.splice(0,2,"下雨了");
console.log(arr);
< /script>
slice和splice :
1. slice不会修改原数组,只是复制出来一份新的内容
2. splice修改原数组的数据,没有复制出新的内容
join(): 将数组中的元素,全部转换为字符串,并拼接起来。 最后返回
< script>
var arr_two = [1,2,3,4,5,6];
var a = arr_two.join();
console.log(typeof arr_two);
< /script>
数组方法
concat:合并两个数组,并返回合并后的新数组
var arr = [1,3,5,2,4];
var arr_two = [8,9,10,'J','Q','K'];
//arr_two作为参数,拼接到了调用者arr的后面。 结合成了一个新的数组
console.log(arr.concat(arr_two));
sort(): 数组排序 ,将调用者中的数据,按照从小到大的顺序排列
< script>
var arr = [1,3,5,2,4];
console.log(arr.sort());
</script>
reverse(): 倒序排列
< script>
var arr = [1,3,5,2,4];
console.log(arr.reverse());
</script>
instanceof 运算,判断 它 是不是一个数组, 并返回 true / false
< script>
var arr = [1,3,5,2,4];
console.log(arr instanceof Array);
//书写方式2:
//Array.isArray(检测对象)
console.log(Array.isArray(arr));
</script>
稀疏数组 (自定义数组时 不允许出现)
< script>
var arr_err = [1,,'a',,4,5,2,,'K'];
console.log(arr_err[1]);
</script>
多维数组: js实际上支持不了多维数组, 但是可以数组嵌套的方式来类似
< script>
var arrs = [ ["刘猛",17,"性别女","爱好男"],
["刘猛",15,"性别女","爱好男"],
["刘猛",19,"性别女","爱好男"],
["张林",18,"男","河南"]
];
//访问和 修改二维数组的单个元素
arrs[0][0] = "小红";
arrs[0][3] = "爱好:要求挺多"
arrs[1][0] = "小明";
console.log(arrs[3]);
< /script>
数组去重和数组排序
<script type="text/javascript">
数组去重
//创建一个参数bb封装
function bb(arr){
//外层循环数组中的每一个数据
for(var i = 0; i<arr.length; i++){
//内层从第二个数据开始往后的数据依次与第一个数据相比较
for(var j = i+1; j<arr.length; j++){
//如果两个数据相同
if(arr[i]==arr[j]){
//删除从j开始的1个长度的数据
arr.splice(j,1);
//数据会自动补位,--1回到删除的数据所对应的下标,继续比较
--j;
}
}
}
//把结果返回
return arr;
}
var a= [1,5,1,4,8,2,8,5];
//调用函数
console.log(bb(a));
//数组排序
var arr=[5,8,1,3,4];
for(var i =0; i<arr.length-1; i++){
for(var j =i+1; j<arr.length; j++){
if(arr[i]>arr[j]){
var aa =arr[i];
arr[i] = arr[j];
arr[j] =aa;
}
}
}
console.log(arr);
</script>
练习题
1. 定义一个具有10个元素的数组, 每个数组元素的值是 50~100之间随机数,并求出它们的加和,最大值,最小值。
// var arr = []; // 空数组
// var sum = 0; // 存储加和
// var max = 0; // 存储最大值
// var min = 100; // 存储最小值
//
// for(var i=0; i<5; i++){
// arr[i] = Math.ceil(Math.random()*(100 - 50)+ 50);
// sum += arr[i];
//
// //判断并求出最大值
// if(max < arr[i]){
// max = arr[i];
// }
//
// //判断并求出最小值
// if(min > arr[i]){
// min = arr[i];
// }
// 或者
// max = max < arr[i] ? arr[i] : max;
// min = min > arr[i] ? arr[i] : min;
// console.log(arr[i]);
//
// }
// console.log("加和为: " + sum);
// console.log("最大值为 :" + max);
// console.log("最小值为: " + min);
//2 定义一个具有20个元素的数组,每个元素的取值范围是30~80之间的随机数,判断这其中是否有40,如果有 那么弹出提示框,提示用户。 如果整个数组都没有,则正常输出整个数组
// var a = [];
// for (var i=0; i<20; i++){
// a[i]= Math.ceil(Math.random()*(80 - 30)+ 30);
//
// if(a[i] == 40){
// alert("随机数中有40");
// }
// }
// console.log(a);
//
//3. 复制一个数组。 即将一个数组的内容完全拷贝到另一个数组(两个数量,内容完全一致的数组)
// var arr1 = [1,2,'t',4,5,'a'];
// console.log(arr1);
// var arr2 = arr1.slice(0,arr1.length);
// console.log(arr2);
//4. 小明和小红的考试成绩不稳定,两人每次的成绩范围都是60~80之间浮动。 一个学期下来,共考了10次试。 小胖每次的成绩,都是他俩每次成绩的加和。 求出小胖一个学期中,每次考试的平均成绩
// var ming =[];
// var hong =[];
// var ming_sum = 0;
// var hong_sum = 0;
// for (var i=0; i<10; i++){
// ming[i]= Math.ceil(Math.random()*(80 - 60)+ 60);
// hong[i]= Math.ceil(Math.random()*(80 - 60)+ 60);
// ming_sum += ming[i];
// hong_sum += hong[i];
// }
//小胖的总成绩 = 小明的总成绩 + 小红的总成绩
// var sum = ming_sum + hong_sum;
// var pj = sum / 10 ;
// console.log("小胖一个学期里每次考试的平均成绩为:" + pj);