一、Array
特点:
数组的长度是可变的;
数组的索引可以是数字、字符串;
数组的内容可以是任意内容;
可以通过索引获取之前不存在的一个位置,其值为undefined;
1、构造函数:
new Array();
new Array(length);
new Array(element0, element1, ..., elementn);
例:var a=new Array(1);a[0]; //undefined; 在初始化时,指定其长度为n,由于尚未指定数组内容,因此获取时只能是undefined;
由于javascript不是一门强类型的语言,所以索引可以是数字、字符串;其内容可以是任意类型的数据
3、length:获取或设置数组的长度
var a= new Array(3);var a=[1,2,3];a[5]=5; a['1']='1';a['a']='a';
a['1']; //"1"
a[1]; //"1"
a['a']; //"a"
a.a; //"a"
a[a]; //undefined
a.length; //6;
如上所示, a['1']='1'; 当索引为字符串且字符串内容为数字时,javascript隐式将其转换为数字,并将内容 '1' 替换数字 1 。
当索引为其他字符串时,如:a['a'] 实际上是将其作为数组的一个属性而非数组内容,因此既可以通过索引访问。也可以通过属性访问,如:a.a;
(1)、即使初始化指定 length,也可以在超出范围的索引进行操作,如上例,设置 length 为3,a[5]=5;则 length被修改为6;
(2)、length 属性表示的只是 索引为数字或可以隐式转换为数字的元素数量。在上面的例子中,由于 a['a'] 实际上通过数组的属性操作而不是索引,所以对 length 属性无影响,此时执行 a.length; //6; 可见其并没有包含a['a']
(3)、当设置的 length 属性小于当前元素时,超出该范围的元素将被移除。例:
var a= new Array(3);var a=[1,2,3];a[5]=5; a['1']='1';a['a']='a';
a; //[1, "1", 3, undefined × 2, 5]
a[5]; //5;
a.length; //6;
a.length=5; //5;
a[5]; //undefined;
a.a; //"a"
a['a']; //"a"
注意即使 a.length=0;此时依然可以通过 a['a'] 获取数据,再次证明通过字符串索引操作数组只是操作数组的属性而不是数组元素。
4、delete:删除数组元素;
delete 将元素内容删除,其值变为 undefined,因为在javascript中,不存在的东西均为 undefined;
例:
var a= new Array(3);var a=[1,2,3];a[5]=5; a['1']='1';a['a']='a';a; //[1, "1", 3, undefined × 2, 5];
delete a[0]; delete a['a']; //true;
a; //[undefined × 1, "1", 3, undefined × 2, 5]
a['a']; //undefined
a.length; //6
5、 for——in 循环:用于遍历数组、对象,但不能取代常规的 for 循环
var result='';
for(var i in a)
{
result=result+'index: '+ i+', value: '+a[i]+';';
}
result;
//"index: 0, value: 1;index: 1, value: 1;index: 2, value: 3;index: 5, value: 5;index: a, value: a;index: clone, value: function (){ return this.concat(); };"
6、数组常用方法
方法 | 说明 |
arr1.concat(arr2) | 连接两个或更多的数组;但不会改变现有的数组,而仅仅会返回被连接数组的一个副本。 |
arr1.join(separator) | 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。否则默认为, |
arr1.pop() | 删除并返回数组的最后一个元素;直接改变原数组。 |
arr1.push() | 向数组的末尾添加一个或更多元素,并返回新的长度。 |
arr1.reverse() | 颠倒数组中元素的顺序;直接改变原数组。 |
arr1.shift() | 删除并返回数组的第一个元素;直接改变原数组。 |
arr1.unshift() | 向数组的开头添加一个或更多元素,并返回新的长度。 |
arr1.slice(start,end) | 从某个已有的数组返回选定的元素但不修改数组;参数为正表示从左往右数,负表示从右往左数;返回数据包含 start,但不包含 end; |
arr1.sort(function) | 对数组的元素进行排序;参数函数用于规定其排序顺序,没有参数则默认按照字符编码的顺序进行排序;小的排在大的前面; |
arr1.splice(index,n,data……) | 删除n个元素,并向数组添加任意个新元素;直接修改原始数组。返回被删除的元素。 |
arr1.toSource() | 返回该对象的源代码。只有 Firefox 支持。 |
arr1.toString() | 把数组转换为字符串,并返回结果。 |
tarr1.toLocaleString() | 把数组转换为本地数组,并返回结果。使用地区特定的分隔符把生成的字符串连接起来 |
arr1.valueOf() | 返回数组对象的原始值 |
例:
- concat():
var a=new Array(3);a[0]=0;a[1]=1;a[2]=2; var b=new Array(3);b[0]=3;b[1]=4;b[2]=5;
a.concat(b); //[0, 1, 2, 3, 4, 5];
a; //[0, 1, 2]; 证明 concat() 方法并没有改变原有数组;
a.concat(b,a); //[0, 1, 2, 3, 4, 5, 0, 1, 2]
a.concat(b).concat(a); //[0, 1, 2, 3, 4, 5, 0, 1, 2] 与上面的方式结果一致
- join()
a.join(); //"0,1,2"
a.join('|'); //"0|1|2"
- pop()
a.pop(); //2;返回最后一个元素 2 ;并删除该元素
a; //[0, 1];
- push()
a.push(2); //3; 数组新的长度为3
a; //[0, 1, 2]
- reverse()
a.reverse(); //[2, 1, 0];
a.reverse(); //[0, 1, 2];
- shift()
a.shift(); //0; //返回数组原来的第一个元素;
a; //[1, 2]
- unshift()
a.unshift(0); //3 ;数组新的长度;
a; //[0, 1, 2];
- slice(start,end):参数从0开始,返回数据包含 start,但不包含 end; 无 end 表示到最后。
a.slice(1); // [1, 2]; 从第二个数据开始,到最后
a.slice(1,2); //[1]; 从第二个数据开始,到第三个数据结束,但不包含第三个数据。
a.slice(1,-2); //[]; 从第二个数据开始,到倒数第二个数据结束,但不包含倒数第二个数据。而 a 的第二个数据也是倒数第二个数据,所以无返回值。
a.slice(-2,-1); //[1]; 从倒数第二个开始,到倒数第一个截止,但不包含倒数第一个
- sort()
a.sort(); //[0, 1, 2];
var a=new Array(3);a[0]='18';a[1]='10';a[2]='2';a; //["18", "10", "2"];
a.sort(); //["10", "18", "2"]; 默认按照字符编码的顺序进行排序;从第一位开始排序;
可以提供比较函数,按照自定义规则进行排序,比较函数提供要比较的两个参数,然后返回一个用于说明这两个值的相对顺序的数字。
如:比较函数应该具有两个参数 a 和 b,其返回值如下:
- 若 a 小于 b,则返回一个小于 0 的值。
- 若 a 等于 b,则返回 0。
- 若 a 大于 b,则返回一个大于 0 的值。
例:function sortab(a,b) { return a-b; } a.sort(sortab); //["2", "10", "18"] //在 - 运算时,现将参数隐式转换为数字;
- splice(index,n,data……)
var a=new Array(3);a[0]=0;a[1]=1;a[2]=2;a; //[0, 1, 2];
a.splice(1,1,'好的','坏的'); //[1]; 返回被删除的与元素。
或
var b=['111','222'];a; //[0, "好的", "坏的", 2]; 将两个元素 '好的','坏的' 插入被删除元素的位置。
a.splice(1,2,b); //["好的", "坏的"]; 返回被删除的元素
a; //[0,Array[2], 2]; 上一步中插入的数据是一个数组,所以出现这种情况。
a[1][0]; // "111"
- toString()
a.toString(); //"0,111,222,2"
- toLocaleString()
a.toLocaleString(); //"0,111,222,2"
- valueOf()
a.valueOf(); //[0,Array[2], 2]