相信使用过Java或者是.NET的人对动态数组类Array(或者是类似的类)都不会陌生——因为这个类好处多多,可以无限扩展其长度大小范围,以便容纳更多的内容。其实在java中也有一个Array对象可以使用,它几乎也是万能的:
【一】当动态数组使用:
这是最最基本的Array使用方法,Array对象有三个“构造函数”:
new Array();
new Array(size);
new Array(element0, element1, ..., elementn);
第一个指定一个空的Array,第二个指定一个长度的Array,最后一个直接填充数据初始化长度和若干内容的Array。无论哪一种,一旦不够用了都可以往里边直接添加数据。添加数据的方法是:
ArrayInstance[索引号,从0开始]=内容;
当然您也可以通过for的方式循环遍历(注意:javascript根本没有int这种显式声明的类型,一律是弱类型的var)
for(var i=起始索引;i<arrayInstance.length;++i) { alert(arrayInstance[i]); }
另外你还可以使用foreach方式(注意,javascript中没有foreach,还是用for的方式,有些类似java的for(变量in集合))
var arr = new Array(1, 2, 3); for (var i in arr) { alert(i); }
以上做法输出会有惊人的发现——竟然是0,1,2而不是1,2,3!Why?注意这里和C#或者java最大的不同在于——C#或者java是把foreach理解成IEnumerator接口对象,访问封装的内部数据;但是js中这样做导致的结果是你只能访问索引号而不是索引的内容,因此你正确的做法是:
var arr = new Array(1, 2, 3); for (var i in arr) { alert(arr[i]); }
除此之外,您还可以这样初始化数组:
var arr=[1,2,3,……,内容];
【当字典使用】
下标不一定非要是数字(默认0开始),Array允许你直接自定义下标,这样一来使用过Dictionary的人往往乐开了花:
var arr = new Array(); arr["a"] = "a"; arr["b"] = "b";
但是注意,此时使用arr.length检测的结果是0!Why?因为这些并不是js的真正下标而是属性而已,属性不算在arr的长度之列,只有0,1,2……这样的下标才算。
遍历这些属性方法同遍历索引一样(使用for版本的foreach)。
之前说过当字典使用的时候属性并非下标,那么属性和下标区别是什么呢?一般地,js语法非常松散,属性并不需要“定义”后才“使用”,允许对已有的“方法类”(对象,并不是真正意义上的类)边动态添加边操作——
function MyFun() { this.A = "a"; } var mf = new MyFun(); mf.B = "B"; mf["C"] = "C"; alert(mf.B); alert(mf.C); alert(mf.A);
注意看粗体部分,就明白了,其实这是一个js的语法范畴的问题,Array作为一个对象也可以这样操作,任意一个js对象都可以这样操作,但是请记住,该对象必须通过new出来这样操作方可,直接调用(比如MyFun.B)是不可以的!
另外,这种“字典型”操作方式还可以和json媲美,因此字典型的初始化还允许:
var a = { "A": "A","B":"B" };
var 变量名 = {"键1":"值1","键2":"值2",……,"键n":"值n"};
访问如同for版的foreach,而且允许动态添加键值对。