1、前言
在讲数组之前我们来聊聊什么是数组。简单来说数组是用来存储相同数据类型的数据集合,该集合存储在堆内存中,由一个引用变量来索引该集合的首地址。(具体的可以去看一门高级编程语言)
组成数组的数据被称为数组的分量、元素或下标变量,个人比较喜欢称为元素。数组中的元素存储在一个连续性的内存块中,并通过索引来访问,也被称为下标。数组第一个元素的下标为0,所以最后的下标为当前长度减一,即应用变量名.length-1,length是数组的长度属性。有多少个元素,其值就为多少。
2、数组的创建 ------ 数组的操作
通过上述的介绍,不明白数组结构的人想必对数组也有了一定的了解,下面我们来正式介绍JavaScript中的Array数组
通过静态的Array对象创建数组对象的有三种方式
创建任意长度的数组对象: 引用变量名 = new Array();
创建指定长度的数组对象: 引用变量名 = new Array(size);
创建指定元素的数组对象: 引用变量名 = new Array(element1,element2,......,elemenN);
JavaScript的Array数组比较特殊,它可以存储不同数据类型的数据。第一种语法创建Array对象时,元素的个数是不确定的,用户可以在赋值时任意定义;第二种语法创建固定数组长度的Array对象,用户在赋值时定义的元素个数不能超过指定的长度;第三种语法在定义Array对象时对数组对象进行赋值,其长度为数组元素的个数,用户可以在当前长度下继续赋值。如果我们只定义Array对象,并不对其进行赋值,那么成为一个空的数组对象。
Test1 = new Array();
Test2 = new Array(5);
Test3 = new Array("1",2,"3","4",5); //Test3长度为5
console.log(Test1);
Test1[1] = 1;
Test1[10] = 10;
console.log(Test1);
console.log("插入新元素后的Test1数组长度为:"+Test1.length);
console.log(Test2);
console.log(Test3);
console.log("Test3当前数组长度为:"+Test3.length);
//往Test3中继续输入元素
Test3[5] = 6;
Test3[6] = 7;
console.log(Test3);
console.log("插入新元素后的Test3数组长度为:"+Test3.length);
3、Array对象元素的操作------Array对象元素的存储和获取
Araay对象元素的存储主要有3种方法,分别如下
(1)、在定义时直接输入数组元素,但该方法只能在数组元素确定的情况下才能使用。
Arr = new Array("a","b","c");
(2)、通过指定下标向数组输入元素,该方法可以任意地将元素插入到指定的数组下标中。但要注意的是:如果Array对象是指定长度的数组对象,那么就要防止插入的下标不能超过制定的长度;如果重复向相同下标中插入元素,那么最后的元素会覆盖掉之前的元素。
Arr = new Array();
Arr[0] = "a";
Arr[1] = "b";
Arr[2] = "c";
(3)、利用循环语向数组批量输入元素。一般用于向Array对象中赋初值。
var num = 5;
for(var i = 0;i < num;i++){
Arr[i] = i;
}
Array对象元素的获取主要也是3种方法,分别如下
(1)、指定具体下标获取元素值,通常将获取的值存储在一个变量中。
Arr = new Array(1,2,3,4,5);
var num1 = Arr[0];
var num2 = Arr[1];
var num3 = Arr[2];
(2)、通过循环语句批量输出
Arr = new Array(1,2,3,4,5,6,7,8,9);
方法一
for(var i in Arr){
document.write(Arr[i]);
}
方法二
for(var i=0;i<Arr.length;i++){
document.write(Arr[i]);
}
(3)、通过数组引用对象名直接输出所有元素,注意输出的元素之间会用逗号隔开。
Arr = new Array(1,2,3,4,5,6,7,8,9);
document.write(Arr);
4、Array对象的属性(不作重点解释)
(1)、length属性用于返回数组的长度,即元素个数。JavaScript数组的length属性是可变的,需要特别注意的是,当length属性被设置得更大时,整个数组的状态事实上不会发生变化,仅仅是length属性变大;当length属性被设置得比原来小时,则原先数组中索引大于或等于length的元素的值全部会丢失。
//创建数组引用对象,当前数组长度为9
var Arr = new Array(1,2,3,4,5,6,7,8,9);
//改变数组长度,大于最先的数组长度
Arr.length = 12;
//打印改变数组长度后的数组元素和长度
console.log(Arr);
console.log("改变后的数组长度为:"+Arr.length);
//再次改变数组长度,小于最先的数组长度
Arr.length = 6;
//打印第二次改变数组长度后的数组元素和长度
console.log(Arr);
console.log("第二次改变后的数组长度为:"+Arr.length);
//再次扩容,大于最后一次改变的长度
Arr.length = 10;
//打印扩容后的数组元素和长度
console.log(Arr);
console.log("第三次改变后的数组长度为:"+Arr.length);
(2)、prototype属性是object共有的,用于向对象添加属性和方法。
//为Array对象添加最大元素值的方法,该方法调用函数array_max获得最大值
Array.prototype.max = array_max;
var x = new Array(1,3,5,4,2);
var y = x.max(); //存储最大值
document.write(y); //输出最大值
function array_max(){
//注意谁调用,该this就是谁,由于是x引用数组调用故,this[0]为1
//定义起始最大值
var max = this[0];
for(var i=1;i<this.length;i++){
if(max < this[i]){ //将遍历的每个元素都和最大值进行比较
max=this[i]; //更新最大值
}
return max;
}
(3)、constructor属性返回当前对象的构造函数名
var Arr = new Array(1,2,3,4,5);
if (Arr.constructor == Array){
document.write("This is an Array");
}else if (Arr.constructor == Boolean){
document.write("This is a Boolean");
}else if (Arr.constructor == Date){
document.write("This is a Date");
}else if (Arr.constructor == String){
document.write("This is a String");
}
5、Array对象的方法
5.1、数组元素的添加和删除
数组元素的添加和删除可以使用concat()、unshift()、push()和pop()、shift()方法实现
(a)、concat()方法可以将其它数组或元素连接到当前数组的尾端。
语法:Arr1.concat(Arr2 or value)
注意:连接后的结果并没有存储在发起连接的数组对象中,所以要么将连接后的结果赋值给连接对象本身更新数组元素,要么就创建一个新的数组对象来存储连接后的结果。具体看下例代码
var arr1 = new Array(3)
arr1[0] = 1
arr1[1] = 2arr1[2] = 3
var arr2 = new Array(3)
arr2[0] = 4
arr2[1] = 5
arr2[2] = 6
var arr3 = new Array(3)
arr3[0] = 7
arr3[1] = 8
arr3[2] = 9
//数组arr1连接arr2和arr3的结果
console.log(arr1.concat(arr2,arr3));
//检验连接后数组arr1的元素,发现并没有改变
console.log(arr1);
//将连接后的数组存储在引用数组对象arr4中
var arr4 = arr1.concat(arr2,arr3);
console.log(arr4); //检验arr4数组
//arr4数组连接具体值10、11、12之后将结果赋值给本身
arr4 = arr4.concat(10,11,12);
console.log(arr4); //检验连接具体值后的arr4数组
从上述代码可以看出,数组arr1指定固定长度为3,当数组arr1和arr2、arr3连接之后长度为9超过了指定长度,但系统不会报错。这是因为连接对象连接其他对象之后成为了一个新的Array对象,并没有将被连接的元素存储到连接对象的尾端,故不会报错;与之不同的是,如果将连接后的新对象赋值给连接对象arr1,那么arr1就会将之前的指引对象断掉重新指向新的Array对象,这一点涉及到Java的内存分配机制(其他语言不作解释)
(b)、unshift()方法可以在指定数组的头部添加一个或多个元素
语法:Array对象名.unshift(value1,value2,......);
注意:和concat方法不一样的是,元素是实际插入到数组中的,并不受限于数组的长度。
var Arr1 = new Array(3)
Arr1[0] = 1
Arr1[1] = 2
Arr1[2] = 3
console.log(Arr1);
Arr1.unshift(4,5); ←----
console.log(Arr1);
(c)、push()方法在数组的末尾添加一个多个元素,并返回数组长度
语法:Array对象名.push(value1,value2,......);
注意:和unshift一样,元素是实际插入到数组中的,并不受限于数组的长度。
var Arr1 = new Array(3)
Arr1[0] = 1
Arr1[1] = 2
Arr1[2] = 3
console.log(Arr1);
Arr1.push(4,5); ←----
console.log(Arr1);
Array对象的删除方法 shift 和 pop 与 unshift 和 push方法一样,只是前者是删除元素,后者是增加元素。这里我就不往下讲解,赶兴趣的同学可以自行学习。
5.2、获取数组中的某段数组元素
Array对象的slice()方法提供了从数组中返回从指定开始到结束下标之间的选定元素。
语法:引用对象名.slice(起始下标,结束下标);
注意:起始下标规定了从那个下标开始取值,如果该值是负数,那么它规定以数组尾部为起点开始逆推,也就是说-1是最后一个元素,-2是倒数第二个元素,以此类推。结束下标规定了从那个下标结束取值,如果该值没有指定,那么切分的数组包含从起点下标开始后的所有的元素;如果该值是负数,那么它的从数组尾部开始算起。
重点在于,截取出来的数组第一个元素就是其实下标元素,而最后一个元素是最终元素的前一个。开始取值和结束取值的含义不同,开始取值包含该元素,而结束取值不包含该元素。另外不管起点和重点的坐标是正数还是负数,起点坐标必须在终点坐标的前面,即无论正负,起点在终点的左边,方向指向右。
var Arr = new Array(1,2,3,4,5,6,7,8,9,10);
//以下标2中的元素为起点,到下标4为结束点,即只读取到下标3
console.log(Arr.slice(2,4));
//起点下标必须在终点下标的左边,两者连线方向指向右。
//以起点为正,终点为负。
console.log(Arr.slice(1,-2));
//以起点为负,终点为正。
console.log(Arr.slice(-8,6));
//以起点为负,终点也为负。
console.log(Arr.slice(-6,-3));
和上面的数组连接一样,这里截取出来也是一个新的数组对象,不影响原数组,所以一般将截取后的数组存储在一个引用变量中,例如:var num = Arr.slice(2,6);
5.3、将数组转换成字符串
将数组转换成字符串的方法有toString()、toLocaleString()和join(),这里我们只讲解toString和join方法。
(1)、toString()方法可以将数组转换为字符串,并返回结果
语法:var sum = Arr.toString();
注意:无论是字符串数组还是数值数组均转换为字符串。
var Arr = new Array(1,2,3,4,5,6,7,8);
//检验转换前的数组元素和数组类型
console.log(Arr);
console.log(typeof Arr);
//检验转换后的数组元素和数组类型
var Container = Arr.toString(); //存储对 ←-----
console.log(Container);
console.log(typeof Container);
(2)、join()方法将数组中的所有元素都放入一个字符串中,可以指定每个元素之间的间隔符。如过没有指定间隔符,则默认使用逗号,如上图效果。
var Arr = new Array(1,2,3,4,5,6,7,8);
//检验转换前的数组元素和数组类型
console.log(Arr);
console.log(typeof Arr);
//检验转换后的数组元素和数组类型
var Container = Arr.join("*"); //存储对象 ←-----
console.log(Container);
console.log(typeof Container);
这篇文章到这里就介绍完毕了,有问题欢迎指出
------ END ------