原创作者: sdcyst   阅读:19613次   评论:35条   更新时间:2011-06-01    

数组
我们已经提到过,对象是无序数据的集合,而数组则是有序数据的集合,数组中的数据(元素)通过索引(从0开始)来访问,
数组中的数据可以是任何的数据类型.数组本身仍旧是对象,但是由于数组的很多特性,通常情况下把数组和对象区别
开来分别对待(Throughout this book, objects and arrays are often treated as distinct datatypes.
This is a useful and reasonable simplification; you can treat objects and arrays as separate types
for most of your JavaScript programming.To fully understand the behavior of objects and arrays,
however, you have to know the truth: an array is nothing more than an object with a thin layer of extra
functionality. You can see this with the typeof operator: applied to an array value, it returns
the string "object".  --section7.5).
创建数组可以用"[]"操作符,或者是用Array()构造函数来new一个.

var array1 = [];  //创建空数组
var array2 = new Array();  //创建空数组
array1 = [1,"s",[3,4],{"name1":"NAME1"}]; //
alert(array1[2][1]);  //4   访问数组中的数组元素
alert(array1[3].name1); //NAME1 访问数组中的对象
alert(array1[8]);   //undefined
array2 = [,,];  //没有数值填入只有逗号,则对应索引处的元素为undefined
alert(array2.length); //3
alert(array2[1]);     //undefined

 用new Array()来创建数组时,可以指定一个默认的大小,其中的值此时为undefined,以后可以再给他们赋值.但是由于
javascript中的数组的长度是可以任意改变的,同时数组中的内容也是可以任意改变的,因此这个初始化的长度实际上
对数组没有任何的约束力.对于一个数组,如果对超过它最大长度的索引赋值,则会改变数组的长度,同时会对没有赋值
的索引处赋值undefined,看下面的例子.

var array = new Array(10);
alert(array.length);   //10
alert(array[4]);       //undefined
array[100] = "100th";  //这个操作会改变数组的长度,同时将10-99索引对应的值设为undefined
alert(array.length);   //101
alert(array[87]);      //undefined

 可以用delete操作符删除数组的元素,注意这个删除仅仅是将数组在该位置的元素设为undefined,数组的长度并没有改变.
我们已经使用过了数组的length属性,length属性是一个可以读/写的属性,也就是说我们可以通过改变数组的length属性来
任意的改变数组的长度.如果将length设为小于数组长度的值,则原数组中索引大于length-1的值都会被删除.如果length
的值大于原始数组的长度,则在它们之间的值设为undefined.

var array = new Array("n1","n2","n3","n4","n5");  //五个元素的数组
var astring = "";
for(var i=0; i<array.length; i++) {           //循环数组元素
    astring += array[i];
}
alert(astring);       //n1n2n3n4n5
delete array[3];                   //删除数组元素的值
alert(array.length + "_" + array[3])  //5_undefined

array.length = 3;    //缩减数组的长度
alert(array[3]);     //undefined
array.length = 8;    //扩充数组的长度
alert(array[4]);     //undefined

 对于数组的其他方法诸如join/reverse等等,在这就不再一一举例.

通过上面的解释,我们已经知道,对象的属性值是通过属性的名字(字符串类型)来获取,而数组的元素是通过索
引(整数型 0~~2**32-1)来得到值.数组本身也是一个对象,所以对象属性的操作也完全适合于数组.

var array = new Array("no1","no2");
array["po"] = "props1";
alert(array.length);   //2
//对于数组来说,array[0]同array["0"]效果是一样的(?不确定,测试时如此)
alert(array[0] + "_" + array["1"] + "_" + array.po);//no1_no2_props1
 
评论 共 35 条 请登录后发表评论
35 楼 aiyust070 2015-02-02 18:10
31楼是对的,用下面的代码可以检测
    var array = ["n1", "n2", "n3"];
    console.log(array.length);

    array["n2"] = "nnn";
    for(var props in array) {

        if (typeof(props) == "string" ) {
            console.log("\t\t" + props + "\t" + array.props);
        } else {
            console.log(props + "\t" + typeof(props));
        }
    }
34 楼 woduha 2012-11-16 09:09
小山羊106 写道
biaowen 写道
geke260 写道

var array = new Array("no1","no2");&nbsp;&nbsp; array["po"] = "props1";&nbsp;&nbsp; alert(array.length);&nbsp;&nbsp; //2&nbsp;&nbsp; 应该结果为3才对啊,不是在后面加了个成员po么。应该是3才对。 不懂。。。。。

javascript 数组下线为0 ,所以length输出为2   0,1,2


照你这么说,如果是var array = new Array("no1");alert(array.length);就输入0了?开玩笑

数组只能用序号操作吧,估计要是写 array[2]="props1",length就是3了
33 楼 小山羊106 2012-09-07 09:46
biaowen 写道
geke260 写道

var array = new Array("no1","no2");&nbsp;&nbsp; array["po"] = "props1";&nbsp;&nbsp; alert(array.length);&nbsp;&nbsp; //2&nbsp;&nbsp; 应该结果为3才对啊,不是在后面加了个成员po么。应该是3才对。 不懂。。。。。

javascript 数组下线为0 ,所以length输出为2   0,1,2


照你这么说,如果是var array = new Array("no1");alert(array.length);就输入0了?开玩笑
32 楼 vs880 2011-06-10 12:34
nettang 写道
array2 = [,,];  //没有数值填入只有逗号,则对应索引处的元素为undefined  
alert(array2.length); //3

这个在IE下输出的是3,在火狐下输出是2??????



IE9也输出2
31 楼 87029274 2011-04-13 09:15
cw1011 写道
zxinger 写道
这个数组是不是相当于有三个属性,相当于 var array={"0":"no1","1":"no2","po":"props1"},而数组的length只能把名字全是数字的属性数出来,故length是两个,而忽视了"po"属性!我是这样理解的!
还有一个问题,四楼说length是一个方法,本人不敢苟同,方法应该后面加一个括号啊,即length(),
winter8 写道
sdcyst 写道
myali88 写道
var array = new Array("no1","no2");
array["po"] = "props1"; 

这里array.length=2,po是array的属性,但是如果这样:
array["10"] = "props1";

则array.length=11,添加是不再是array的属性。

arrray["10"]=11 同 array[10]=11的结果是一样的

这个数组是不是相当于有三个属性,相当于 var array={"0":"no1","1":"no2","po":"props1"},而数组的length只能把名字全是数字的属性数出来,故length是两个,而忽视了"po"属性!我是这样理解的!
还有一个问题,四楼说length是一个方法,本人不敢苟同,方法应该后面加一个括号啊,即length(),

是不是可以这样理解,数组的属性包含值,即属性名是数字的属性才是数组的值。这样数组值一定是数组的属性,属性不一定是数组的值。

其实po:props1这个应该用括号括起来的{po:props1}这样数组会把他当做一个元素 数组中没有length是属性不是方法的至于说数组中arry[0]和arry["0"]是相同的 我觉得不是  array[0]应该是指下表为0的


个人在IE下把各种情况都测试了一下,得出一下结论:
1.在javascript中数组是一种特殊的对象,数组中各项都是它的属性,只不过一部分属性名是0,1...等下标数字。所以array[0]和array["0"]相等的,都是取得下标为0的值,也就是属性名为0的值
2.length也是数组的属性(这个属性是系统自动统计添加的),所以array.length 和 array["length"]显示的都是数组的长度,但是有一点要注意,数组统计长度时统计的只是属性名为数字的的属性的个数。
所以var array = new Array("no1","no2");  
array["po"] = "props1";  
alert(array.length);   //2  这个数组长度仍为2。

30 楼 wonka438 2011-03-05 14:59
wonka438 写道
this.vtip = function() {    
this.xOffset = -10; // x distance from mouse
this.yOffset = 10; // y distance from mouse   

29 楼 wonka438 2011-03-05 14:59
this.vtip = function() {    
this.xOffset = -10; // x distance from mouse
this.yOffset = 10; // y distance from mouse   
28 楼 wonka438 2011-03-05 14:33
this.vtip = function() {    
    this.xOffset = -10; // x distance from mouse
    this.yOffset = 10; // y distance from mouse   
27 楼 seagulls88 2010-10-17 20:12
biaowen 写道
geke260 写道

var array = new Array("no1","no2");&nbsp;&nbsp; array["po"] = "props1";&nbsp;&nbsp; alert(array.length);&nbsp;&nbsp; //2&nbsp;&nbsp; 应该结果为3才对啊,不是在后面加了个成员po么。应该是3才对。 不懂。。。。。

javascript 数组下线为0 ,所以length输出为2   0,1,2

大哥,你别误导人家啊,length是你这样算的?
26 楼 ZHJason 2010-09-07 17:06
 
25 楼 JamesQian 2010-08-31 00:16
是的 如果是array["prop"] = "property";因为数组本身也是对象,所以只是添加属性而已!这个可以参考下作者的前面一篇文章。不过那时的写法是array.prop = "property";
24 楼 JamesQian 2010-08-31 00:14
array["2"] = array[2]在firefox经过firebug的结果
23 楼 cw1011 2010-06-11 11:12
zxinger 写道
这个数组是不是相当于有三个属性,相当于 var array={"0":"no1","1":"no2","po":"props1"},而数组的length只能把名字全是数字的属性数出来,故length是两个,而忽视了"po"属性!我是这样理解的!
还有一个问题,四楼说length是一个方法,本人不敢苟同,方法应该后面加一个括号啊,即length(),
winter8 写道
sdcyst 写道
myali88 写道
var array = new Array("no1","no2");
array["po"] = "props1"; 

这里array.length=2,po是array的属性,但是如果这样:
array["10"] = "props1";

则array.length=11,添加是不再是array的属性。

arrray["10"]=11 同 array[10]=11的结果是一样的

这个数组是不是相当于有三个属性,相当于 var array={"0":"no1","1":"no2","po":"props1"},而数组的length只能把名字全是数字的属性数出来,故length是两个,而忽视了"po"属性!我是这样理解的!
还有一个问题,四楼说length是一个方法,本人不敢苟同,方法应该后面加一个括号啊,即length(),

是不是可以这样理解,数组的属性包含值,即属性名是数字的属性才是数组的值。这样数组值一定是数组的属性,属性不一定是数组的值。

其实po:props1这个应该用括号括起来的{po:props1}这样数组会把他当做一个元素 数组中没有length是属性不是方法的至于说数组中arry[0]和arry["0"]是相同的 我觉得不是  array[0]应该是指下表为0的
22 楼 zxinger 2010-04-22 12:42
这个数组是不是相当于有三个属性,相当于 var array={"0":"no1","1":"no2","po":"props1"},而数组的length只能把名字全是数字的属性数出来,故length是两个,而忽视了"po"属性!我是这样理解的!
还有一个问题,四楼说length是一个方法,本人不敢苟同,方法应该后面加一个括号啊,即length(),
winter8 写道
sdcyst 写道
myali88 写道
var array = new Array("no1","no2");
array["po"] = "props1"; 

这里array.length=2,po是array的属性,但是如果这样:
array["10"] = "props1";

则array.length=11,添加是不再是array的属性。

arrray["10"]=11 同 array[10]=11的结果是一样的

这个数组是不是相当于有三个属性,相当于 var array={"0":"no1","1":"no2","po":"props1"},而数组的length只能把名字全是数字的属性数出来,故length是两个,而忽视了"po"属性!我是这样理解的!
还有一个问题,四楼说length是一个方法,本人不敢苟同,方法应该后面加一个括号啊,即length(),

是不是可以这样理解,数组的属性包含值,即属性名是数字的属性才是数组的值。这样数组值一定是数组的属性,属性不一定是数组的值。
21 楼 CalebIce 2010-01-25 17:27
habzyhs 写道
var array = new Array("no1","no2");   
array["po"] = "props1"; 

对这句的理解果然还不是很明白。。

这句array["po"] = "props1";应该是声明了一个po属性,可以直接用array.po来调用。
20 楼 habzyhs 2009-12-14 09:37
var array = new Array("no1","no2");   
array["po"] = "props1"; 

对这句的理解果然还不是很明白。。
19 楼 winter8 2009-10-03 12:10
再问一下楼主:是不是如果用{},那么括号里就必须有键,又要有值;而如果用[],那么括号里就不用写键,只写值,键已经以"0","1"……的方式编好了!偶的理解
18 楼 winter8 2009-10-03 11:37
sdcyst 写道
myali88 写道
var array = new Array("no1","no2");
array["po"] = "props1"; 

这里array.length=2,po是array的属性,但是如果这样:
array["10"] = "props1";

则array.length=11,添加是不再是array的属性。

arrray["10"]=11 同 array[10]=11的结果是一样的

这个数组是不是相当于有三个属性,相当于 var array={"0":"no1","1":"no2","po":"props1"},而数组的length只能把名字全是数字的属性数出来,故length是两个,而忽视了"po"属性!我是这样理解的!
还有一个问题,四楼说length是一个方法,本人不敢苟同,方法应该后面加一个括号啊,即length(),
17 楼 moliu 2009-09-19 10:25
array2 = [,,];&nbsp; //没有数值填入只有逗号,则对应索引处的元素为undefined&nbsp;&nbsp; alert(array2.length); //3 这个在IE下输出的是3,在火狐下输出是2??????
nettang 写道
nettang 写道

array2 = [,,];&nbsp; //没有数值填入只有逗号,则对应索引处的元素为undefined&nbsp;&nbsp; alert(array2.length); //3 这个在IE下输出的是3,在火狐下输出是2??????


在谷歌下也是2

----这些死角旯旮,咱初学者就不要管它啦
16 楼 moliu 2009-09-19 10:16
----数组的值和数组的属性,不是一个概念
suko 写道
geke260 写道

var array = new Array("no1","no2");&nbsp;&nbsp; array["po"] = "props1";&nbsp;&nbsp; alert(array.length);&nbsp;&nbsp; //2&nbsp;&nbsp; 应该结果为3才对啊,不是在后面加了个成员po么。应该是3才对。 不懂。。。。。

数组也是对象,所以数组可以有自己的属性,但是属性和值不是一个概念,"no1"和"no2"都是数组的值,而array["po"]是给数组添加了一个属性,其长度当然就没变了。


----
15 楼 moliu 2009-09-19 10:14
数组元素的
sdcyst 写道
myali88 写道
var array = new Array("no1","no2");
array["po"] = "props1"; 

这里array.length=2,po是array的属性,但是如果这样:
array["10"] = "props1";

则array.length=11,添加是不再是array的属性。

arrray["10"]=11 同 array[10]=11的结果是一样的

----长见识啊!谢谢
14 楼 sdcyst 2009-08-10 17:37
myali88 写道
var array = new Array("no1","no2");
array["po"] = "props1"; 

这里array.length=2,po是array的属性,但是如果这样:
array["10"] = "props1";

则array.length=11,添加是不再是array的属性。

arrray["10"]=11 同 array[10]=11的结果是一样的
13 楼 myali88 2009-06-05 17:08
var array = new Array("no1","no2");
array["po"] = "props1"; 

这里array.length=2,po是array的属性,但是如果这样:
array["10"] = "props1";

则array.length=11,添加是不再是array的属性。
12 楼 tanqu2008 2009-06-03 11:05
这段代码很诡异,优先取得属性的值,然后再去查看数组?
11 楼 tanqu2008 2009-06-03 11:05
var array = new Array("no1", "no2");
array["po"] = "props1";
array["1"] = "no3";
alert(array.length);
alert(array["1"] + "_" + array[1] + "_" + array["po"]);
10 楼 JaHunter 2009-05-21 17:10
    
9 楼 suko 2009-05-21 10:44
geke260 写道

var array = new Array("no1","no2");&nbsp;&nbsp; array["po"] = "props1";&nbsp;&nbsp; alert(array.length);&nbsp;&nbsp; //2&nbsp;&nbsp; 应该结果为3才对啊,不是在后面加了个成员po么。应该是3才对。 不懂。。。。。

数组也是对象,所以数组可以有自己的属性,但是属性和值不是一个概念,"no1"和"no2"都是数组的值,而array["po"]是给数组添加了一个属性,其长度当然就没变了。
8 楼 biaowen 2009-05-02 13:59
geke260 写道

var array = new Array("no1","no2");&nbsp;&nbsp; array["po"] = "props1";&nbsp;&nbsp; alert(array.length);&nbsp;&nbsp; //2&nbsp;&nbsp; 应该结果为3才对啊,不是在后面加了个成员po么。应该是3才对。 不懂。。。。。

javascript 数组下线为0 ,所以length输出为2   0,1,2
7 楼 geke260 2009-04-26 01:17
var array = new Array("no1","no2");  
array["po"] = "props1";  
alert(array.length);   //2  

应该结果为3才对啊,不是在后面加了个成员po么。应该是3才对。
不懂。。。。。
6 楼 sunwenran 2009-04-01 15:21
还好,2,3之争不影响实际编程,一般不这样初始化

发表评论

您还没有登录,请您登录后再发表评论

文章信息

Global site tag (gtag.js) - Google Analytics