数组的概念及定义
一组一般情况下相同类型的数据。除了 Object 类型之外,Array 类型是ECMAScript 最常用的类型。而且 ECMAScript 中的 Array 类型和其他语言中的数组有着很大的区别。 虽然数组都是有序排列, 但 ECMAScript 中的数组每个元素可以保存任何类型。ECMAScript 中数组的大小也是可以调整的。
数组的创建方式
- 第一种是 new 运算符(构造函数);
注意:给构造函数传递一个值也可以创建数组。如果传递的是数字,则会按照该数字创建包含给定项数的数组;而如果传递的是其他类型的参数,则会创建包含那个值的只有一项的数组。 - 第二种是字面量;
在计算机科学中,字面量是用于表达源代码中一个固定值的表示法。
字面量表示如何表达这个值,一般除去表达式,给变量赋值时,等号右边都可以认为是字面量。
数组的操作
- 使用索引下标来读取数组的值--下标是固定的,从0开始
- length:静态赋值/动态赋值(动态的,无需指定大小)
- 数组的length属性 ,代表长度
数组的 length 属性不只是只读的。通过设置这个属性,可以从数组的末尾移除项或向数 组中添加新项。
- 数组的遍历通过for循环
- 检测数组:Array.isArray() 静态方法
Array.isArray():确定括号中的某个值到底是不是数组
数组的方法
- push() 可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。
- pop() 从数组末尾移除最后一项,减少数组的length值,然后返回移除的项。
- unshift()方法能够在数组前端添加任意个项并返回新数组的长度。
- shift() 方法能够移除数组中的第一个项并返回该项,同时将数组长度减 1。
- reverse() 方法会反转数组项的顺序。
- sort() 方法按字母表升序排列数组项。
注意:如果按照其他方式而非字母表顺序进行数组排列,必须给sort方法传递一个比较函 数做参数。
var arr=[12,54,7,9,562,123,17,5666];
function compare(a,b){
return a-b
}
alert(arr.sort(compare));
- concat() 方法可以基于当前数组中的所有项创建一个新数组。
var arr=['d','e','a','c','b'];
var arr1=['hello','hi'];
var arr2=[3,6,9];
//var newarr=arr.concat();//赋值一份arr
//var newarr=arr.concat(arr1,arr2);//合并数组,d,e,a,c,b,hello,hi,3,6,9
var newarr=arr.concat('haha',arr1,arr2,'xixi','hehe');//合并数组,给数组添加新的数组项。
alert(newarr);
alert(arr);//不会影响原数组。d,e,a,c,b
- slice() 方法它能够基于当前数组中的一或多个项创建一个新数组。可以接受一或两个参数,即要返回项的起始和结束位置,不包括结束位置。
var arr=['a','b','c','d','e'];
var newarr=arr.slice(1);//从1下标处开始截取,直到数组结束。 bcde
var newarr=arr.slice(1,3);//从1下标处开始截取,直到下标3处结束,不包括3。 bc
var newarr=arr.slice();//没有参数,截取全部 a,b,c,d,e
var newarr=arr.slice(0,-3);//负数从后面往前数,从-1开始 a,b
var newarr=arr.slice(0,2);//a,b
var newarr=arr.slice(-5,-1);//a,b,c,d
var newarr=arr.slice(-1,-5);//空白。
alert(newarr);
- splice() 方法,对数组进行删除、插入、替换,是最强大的数组方法。返回值是数组。
//var arr=['a','b','c','d','e'];
alert(arr.splice(0,3));//截取 从0位置开始,截取3个长度。 对数组进行删除
alert(arr.splice(0,3,'hehe','xixi','haha'));//替换
alert(arr);//hehe,xixi,haha,d,e 替换:删除了3个数组项,插入三个数组项。
alert(arr.splice(1,0,'hehe'));//插入
alert(arr);
- join()方法,将数组转换成对应的字符串。参数就是连接符。
整数数组/字符串数组/对象数组/二维数组
for...in循环
数组的排序
- 冒泡排序
冒泡排序
var arr=[12,65,12,789,1,2,12,65,3,4,8,4,3,12];
var times=0;
for(var i=0;i<arr.length-1;i++){//控制遍历的次数
for(var j=0;j<arr.length-i-1;j++){
if(arr[j]<arr[j+1]){
var temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
times++;
}
}
console.log(arr);
console.log(times);
- 选择排序
选择排序
var arr=[12,65,12,789,1,2,12,65,3,4,8,4,3,12];
for(var i=0;i<arr.length;i++){
var minIndex=i;//最小值的索引(下标);
var minValue=arr[minIndex];//最小值。
for(var j=i+1;j<arr.length;j++){
if(arr[j]<minValue){//当arr[j]比最小值还要小,arr[j]最小值。
minValue=arr[j];//最小值
minIndex=j;//最小值的索引
}
}
//外层循环假设最小值,内层的循环会返回比较后的最小值的索引。
if(minIndex!=i){//如果我假设不是最小值,交互。
var temp=arr[minIndex];
arr[minIndex]=arr[i];
arr[i]=temp;
}
}
console.log(arr);
- 快速排序
快速排序
function quickSort(array){
if(array.length<=1){
return array;
}else{
var midIndex=Math.ceil(array.length/2);
var midValue=array.splice(midIndex,1)[0];
var left=[];
var right=[];
for(var i=0;i<array.length;i++){
if(array[i]<midValue){
left.push(array[i]);
}else{
right.push(array[i]);
}
}
return quickSort(left).concat(midValue,quickSort(right)) ;
}
}
var arr=[12,65,12,789,1,2,12,65,3,4,8,4,3,12];
console.log(quickSort(arr));
值传递和引用传递。
JS堆和栈的了解以及索引思维
- 栈:自动分配内存空间,系统自动释放,基本类型的值和引用类型的地址
- 堆:动态分配的内存,大小不定,也不会自动释放。存放引用类型的值。
对象的本质和意义
对象是javascript的数据类型。对象是一种复合值,它将很多值聚合在一起,可通过名字访问这些值。对象也看做是属性的无序集合,每个属性都是一个名/值对。
JSON表示对象的方法:利用json的方式创建对象。(类似于字面量创建对象)
- json: 是一种轻量级的数据交换格式。不是js独有的。
- json组成:简单值+对象+数组。
- json里面字符需要添加双引号。
- json没有var关键字,没有分号(;)
应用
1.随机生成一个五位以内的数,然后输出该数共有多少位,分别是什么。
2.数组的冒泡排序(封装函数)
3.数组的选择排序(封装函数)
4.编写函数map(arr) 把数组中的每一位数字都增加30%
5.编写函数has(arr , 60) 判断数组中是否存在60这个元素,返回布尔类型
6.随机点名程序
综合应用
- 编写函数norepeat(arr) 将数组的重复元素去掉,并返回新的数组。
- 有一个从小到大排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
- 定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个数组中并输出。试编程。
- 通过循环按行顺序为一个5×5的二维数组a赋1到25的自然数,然后输出该数组的左下半三角。试编程。
- 使用字面量形式创建一个对象,该对象存储一个学生的信息,该对象包含姓名,学号、身份证、年龄、性别、所学专业等属性信息,同时该对象包含一个自我介绍的方法,用来输出该对象的所有信息.