有关 JS 数组的基础知识,在此总结一下。主要用一个例子加足够注释来说明和总结。
<script type="text/javascript" charset="utf-8">
var arr0 = []; // arr0 没有数组元素
alert("for arr0 = [], arr0.length = " + arr0.length); // arr0.length = 0
var arr1 = [1,2];
var arr2 = [,,];
for(var i=0; i<arr2.length; i++){
alert("for arr2=[ , , ] , arr2[" + i + "] = " + arr2[i]);
} // undefined, 注意arr2.length 为 3
// 可见 JS 中数组不要求数组元素类型一致, 最后的, 表明后面还有一个元素为 undefined
var arr3 = [1.1 , true , "abc",];
// arr3.length = 4,注意,长度为4,但是最后一个为 undefind
alert("for arr3 = [1.1 , true , 'abc',], arr3.length = " + arr3.length);
alert("arr3[3] = " + arr3[3]);
// 数组元素可以是任何表达式或数组,对象
var base = 123;
var arr4 = [ base+1 , base+2 , [1,"hello"] , new Object() ];
arr4[100] = "New"; // 添加元素后,自动更新length
alert(" arr4[1] = " + arr4[1]);
alert("after arr4[100], arr4.length = " + arr4.length);
//101,可见数组长度并不一定等于数组元素个数
alert("after arr4[100], arr4[50] = " + arr4[50]);
// 通过改变 length 截断数组
arr4.length = 50;
alert(" after arr4.length = 50 , the arr4[100] = " + arr4[100]);
arr4[-1.23] = true;
arr4["1000"] = 888;
arr4[1.000] = 99;
alert("arr4[1000] = " + arr4[1000]);
alert(" arr4[1] = " + arr4[1]);
alert("for arr4 = [ base+1 , base+2 , [1,'hello'] , new Object() ] , the arr4[2][1] = " + arr4[2][1]); //hello
alert("for arr4 = [ base+1 , base+2 , [1,'hello'] , new Object() ] , the arr4[4] = " + arr4[4] +
", and the type of arr4[3] is " + typeof(arr4[3]) ); // undefined, object
alert("看到此句,表明数组不存在下标越界问题 arr4[9999999] = " + arr4[9999999]); // undefined
var a = new Array(); // 等价于 new Array(0); 其中的整数参数代表数组元素个数
alert("the type of a is Array :" + ( a instanceof Array));
// 下面仅仅弹出 false, 因为 "the type of a is Array :"+ a 得到字符串(the type of a is Array :)
// 然后才执行 instanceof ,于是返回 false
alert("the type of a is Array :" + a instanceof Array);
alert("for a = new Array() , a.length = " + a.length ); // 0
// new Array(3) 和 [, , ] 其 length 都不为0,元素为 undefined
// 不同于 new Array(), [], 它们的 length= 0, 元素都是不存在的。
var b = new Array(3);
alert("for b = new Array(3) b.length = " + b.length);
var ar1 = [];
ar1.push("one_1");
ar1.push("two_2","three_3");
ar1.unshift("zero_0");
// unshift 方法是将其参数插入到调用数组的第一个位置上,原来数组的其他元素依次后移
for(var i=0 ,len = ar1.length ; i<len; i++) // 优化效率,避免每次都查询 length
alert("after unshift : ar1[ " + i + "] = " + ar1[i] );
// delete后,索引1位置上不再有元素,但是不影响数组长度
// 而且此时,ar1[1] = undefined, 其他元素则不改变
delete ar1[1];
alert("after delete ar1[1] , ar1.length = " + ar1.length);
var r1 = ["a","b","c"];
r1.x = 99; //插入属性后,不同的遍历方式,输出不同
r1[3] = "Kitty";
for(var i=0; i < r1.length; i++){
alert("for r1 , r1[" + i +"] = " + r1[i]); // 仅仅输出 a,b,c,kitty
}
for(var m in r1){
alert("for r1, r1[" + m +"]= " + r1[m]); // 输出 a,b,c,99,kitty
}
// ECMAScript 5 定义的新遍历方式
var data = [1,2,3,4,5];
var sumOfSquares = 0;
// if(data.hasOwnProperty("forEach")){ // 判断对象是否有其属性
// data.forEach(function(x){
// sumOfSquares += x*x;
// });
alert("sumOfSquare = " + sumOfSquare); // 有其属性时,应该输出 55 (=1+4+9+16+25)
// 下面的一些数组常用操作方法都继承自 Array.prototype
// join,reverse,sort,concat,slice,splice,push,pop,shift,unshift,toString,toLocalString
// forEach,map,filter,every,some,reduce,reduceRight,indexOf,lastIndexOf,
//var array = [ 1, 2, 3 ];
//a.join(); // join方法不指定分隔符时,默认用逗号分隔元素,返回拼接在一起的字符串
</script>