数组——基本语法
除了Object之外,Array类型恐怕是ECMAScript中最常用的类型了,而且ECMAScript中的数组与其他语言中的数组有着相当大的区别。它的每一项可以保存任何类型的数据(也就是一个数组里面可以包含不同数据类型的值)。而且,数组的大小是动态的,随着数据的增删而增大减小。
创建
1.使用Array构造函数
//不指定数组长度和元素,返回一个无长度空数组 var arr = new Array();
//只指定数组长度,返回一个有长度的空数组 var arr = new Array(20);
//只指定数组内的元素,返回一个有长度的非空数组 var arr = new Array("AI-fisher",true,undefined,{name:"admin"},[5,6,7],function(){},NaN,null,18);
2.使用字面量表示法创建
//不指定数组长度,返回一个无长度空数组 var arr = [];
//只指定数组内的元素,返回一个有长度的非空数组 var arr = ["AI-fisher",true,undefined,{name:"admin"},[5,6,7],function(){},NaN,null,18];
【注】:
(1)用构造函数创建数组,赋值一个数值型数据(如果是NaN的话,报错长度无效)识别为指定数组长度,其他情况都识别为指定具体元素,其他两种赋值都与字面量创建方式相对应;
(2)不要在最后一个元素后面写一个“,”因为在IE8及之前版本会多识别一个元素,那个元素的值是undefined。开发人员大多青睐于字面量语法,因为不但代码少,而且能给人一种封装数据的感觉。
表示
数组中的每个数据都被赋予一个索引,索引的范围为[0,arr.length-1]内的整数(arr为一个数组),例如上面指定数组内元素的例子中,结果展开是这样:
我们来遍历一下这个数组:
var arr = ["AI-fisher",true,undefined,{name:"admin"},[5,6,7],function(){},NaN,null,18]; for(i=0;i<=arr.length-1;i++){ console.log("arr[" + i + "]的值为:" + arr[i] + ",类型为:"+ typeof(arr[i])); }
【注】:
数组的第一位和最后一位比较特别,因为不管数组怎么变化,第一位的索引一直是0,表示为arr[0],而最后一位虽然具体的位序会随之变化,但是如果用arr[length-1]表示的话,就没有问题了,因为length是随着数组的长度动态变化的。
操作(通过自身的属性)
知道了怎么表示(查看)数组内的每个元素,那我们就可以来操作数组了(不涉及到数组方法的情况下),数据的操作不外乎增删改查:
查(访问):
之前提到了(就是通过索引),也是其他三个基本操作的支柱性操作,因为其他操作的执行都涉及到访问元素
增:
var arr = ["AI-fisher",true];
console.log("打印不存在的元素为:" + arr[10]);
arr[10] = "我是新增的那个";
console.log(arr[10]); // 打印新增的元素
console.log(arr); // 打印新增后的数组
console.log(arr[5]); // 打印被动新增的元素
【注】:
(1)数组被创建后,数组内所有的元素不管存不存在,都已经被声明,只不过没有被赋值;
(2)想要在数据中新增一个元素,直接把值赋值给你想要新增的那一位置的元素,也就是这个例子中的第十一元素(arr[10]);
(3)新增元素之前的元素,如果不存在,就会被赋予一个undefined(因为只被声明,没有赋值),也会增加数组的长度。
删:
var arr = ["AI-fisher",true];
arr.length = 1; //通过改变数组的长度把数组之后的元素删除
console.log(arr); //删除后的数组
console.log(arr[1]); //打印删除的元素
结合之前新增元素的例子,我们可以得出一个结论:数组的length属性不是静态的,它不只是可读,因此,我们可以通过设置这个属性,从数据的末尾移除项或像数组中添加新项。作为数组的两个核心位置,不管数组怎么变化,它们都只代表数组第一位和最后一位。就像是拉力器的两个拉环一样,弹簧被拉伸多少,都逃离不了拉环给它们的范围。
改:
var arr = ["AI-fisher",true];
arr[1] = "我代替了true";
console.log(arr[1]); // 打印替换后的元素
console.log(arr); //打印替换后的数组
用索引的方式,直接赋值即可
总结:
通过数组本身自带的属性:索引和长度,我们能实现基本的数组操作(增删改查),但是我们也能看到其局限性,功能单一而且麻烦。改和查倒还好,虽然功能单一但是操作简便,但是增和删就表现得有点尴尬了,所以后续会补充数组的各种方法,让数组的操作更加人性化,具体请参考本人另一篇博客:https://www.cnblogs.com/AI-fisher/p/11101855.html。