JavaScript数组的基础知识

作者:admin     字体:[增加 减小]    类型:原创
本文讲解了JavaScript数组的基础知识,包括数组与对象的不同,数组的length属性,稀疏数组,如何删除数组元素,等等,并且配有详尽的实例,供大家学习使用。

数组是对象的特殊形式,使用方括号访问数组元素就像用方括号访问对象的属性一样。JavaScript将指定的数字索引值转换成字符串————索引值1变成“1”————然后将其作为属性名来使用。关于索引值从数字转换为字符串没什么特别之处,对常规对象也可以这么做。

var o = {};
o[1] = 1;
o[1.34] = 2;
console.log(o); //Object {1: 1, 1.34: 2}

数组的特别之处在于,当使用非负整数作为属性名时数组会自动维护其length属性值。

稀疏数组是包含从0开始的不连续索引的数组。通常,数组的length属性值代表数组中元素的个数。如果是稀疏数组,length属性值大于元素的个数。可以用Array()构造函数或者简单地指定数组的索引值大于当前的数组长度来创建稀疏数组。

var aa = new Array(5);  //数组没有元素,但是a.length是5
bb = [,,];      //用数组直接量创建数组,length=2;
console.log(bb.length); //2
bb[1000] = 0;   //赋值添加一个元素,但是JS自动设置length为1001

需要注意的是,当使用连续的逗号省略数组直接量中的值时,得到的也是稀疏数组,省略掉的值是不存在的。如果只有一个逗号,[,]数组则长度为1,没有元素。

var aa = [1,,,,,3];
console.log(aa.length); //长度是6
console.log(2 in aa);   //false,但是不存在索引为2的元素

关于数组的长度,要记住一条根本原则,在数组中找不到一个元素的索引值大于或等于它的长度。为了维持此规则,数组有两个特殊的行为。第一,如果为一个数组元素赋值,它的索引i大于或等于数组的长度时,length属性的值将设置为i+1。第二个特殊的行为是设置length属性为一个小于当前长度的非负整数n时,当前数组中那些索引值大于或等于n的元素将从数组中删除。

删除数组元素与删除对象元素一样,均采用delete,对一个数组元素使用delete不会修改数组的length属性,也不会将元素从高索引处移下来填充已删除属性留下的空白。如果从数组中删除一个元素,它就会变成稀疏数组。

下面给出一些示例,大家仔细体会。

var a = [];
for(var i = 0;i<10;i++){
    a[i] = i;
}
a['x'] = 1;
a['y'] = 1;
Object.defineProperty(a,"r",{
    get: function() {
        return Math.sqrt(this.x * this.x + this.y*this.y);
    },
    enumerable:false,
    configurable:false
})
console.log(a.length);  //10,length只会检测属性名是非负整数的元素
console.log(a.r);

var a1= [,];    //此数组没有元素,长度是1
console.log(0 in a1);   //false