1.数组的概念
1、创建数组的方式
(1)数组直接量
var empty=[ ];
var undefs=[ , ,];
(2)调用构造函数
var a=new Array();
var a=new Array(5,4,3,2,1,"testing"} //js是一种非类型语言,数组中元素类型可以不一致
var a=new Array(10);
2、数组元素的读和写
i=2;
a[i]=3;
a[i+1]="hello";
a[a[i]]=a[0];
数组元素下标大于等于0,小于2的32次方减1,若超出这个范围或是负数、浮点数等,js将其转为字符串作为对象属性名,而不是数组下标。
a[-1.23]=true;
3、添加数组元素
js不像java等一旦申明数组长度将保持不变,js中数组元素的个数是随时可以改变,且数组元素的下标不必在某个连续整数范围内,只有那些在数组中存在的元素才会被分配内存
a[0]=1;
a[999]=999;//只有下标是0或是999的元素才会被分配内存,之间的元素将不会被分配内存
4、删除数组
delete运算符只是将数组元素值赋予了undefined,数组元素还存在;真正删除数组元素用shift
5、数组的长度
和常规的对象属性不同,数组的长度是动态更新的
var a=new Array();//a.length==0
a=new Array(10);//a.length==10
a=new Array(1,2,3)//a.length==3;
a=[5,6];//a.length==2
a[49]=0;//a.length==50
由于数组中可能还有undefined元素,所以数组的长度是数组中元素的最大下标数加1
6、遍历数组元素
若数组元素下标是连续的可以用常规的for循环迭代元素,一般在迭代前我们要检验数组元素是否被定义
for(var i=0;i<a.length;i++)
if(a[i])alert(a[i]);
7、难点
var lea = [];
lea[0] = 'a';
lea[1] = 'b';
lea['name'] = 'abc';
alert(lea['name']);
alert(lea);执行结果;
当你把其中的 lea[0] = 'a'; lea[1] = 'b';注释掉后,执行结果是:
你得到是是啥?空,不是null是空!返回的不是Array的数据类型也不是数组的内容,是空……
var m = {
name:"keel",
age:5
}
var a = [m,"sss",3];
console.info(m["name"]);
console.info(a[0]["name"]);
console.info(a[0].name);
console.info(a[0]);
console.info(m.name);
console.info(m["age"]);
console.info(m[0]);执行结果:
认真看下,发现如果以var lea = []; lea['name'] = 'abc';这样的形式命名和 var m = { name:"keel", age:5 }这种方式命名的array数组,并不适合使用array[n]的形式去读取。因为js在处理的时候并没有把内容序列化。所以在最终结果当中,出现了得不到结果。
也就是说,在JS中,使用arrar[n]="xx";赋值得到的内容与array["name"]="xx";赋值得到的内容并没有放到一个序列当中,是分成两块内存进行的存储,两个互不干扰,相当于两个数组变量~
但是在直接输出array数组的时候,没有使用a[]这样命名的数组里面有内容,但是却不会被当做string进行处理, 所以,内容是得不到的~
但是在使用
var m = {
name:"keel",
age:5
}
这样的命名方式的时候,内容会被当做是Object得到。所以也不会取值~这样结果就比较正常。为什么是OBJECT呢?因为这个时候,m就是一个枚举型。所以被稻作了一个Object对待。所以,在数据命名当中尽量少使用a["name"]="xx";这样的形式。这种命名方式会被大量的忽略掉。 为什么呢?主要原因就是因为这种方式是属于方法中的属性读取。也就是说,你这样读取的内容,是读取了a的一个特别属性,和使用a.name读取到得内容是一样的。