JavaScript中的数组是弱类型的,值可以是不同类型的元素。数组的长度是有限制的最短0,最长是2^32-1;
1.数组创建方式
①字面量创建:
var a = [0,"array",null,undefined];
字面量创建的时候,两个逗号之间代表是undefined,但是由于数组最后可以多加一个逗号,所以有:
var a = [1,,3] // [1,undefined,3]
var a = [1,2,,] // [1,2,undefined] 最后一个逗号右边没有undefined
②内置对象创建:
var b = new Array(100); // 创建了一个length为100的空数组
var b = new Array("100") // 这样创建的是长度为1的数组,元素是字符串"100"
并且new可以省略,即:
var b = Array(100); // 创建了一个length为100的空数组
也可以这样创建:
var b = Array(0,"array",null,undefined);
2.数组元素的读写
注意JavaScript中数组是动态的:
var arr = new Array();
稀疏数组就是对于上面说的arr数组 1 in arr // falsearr[0] = 1; //添加一个元素 arr[100] = 2; //这样0-100之间全是undefined [1,undefined*99,2] // 实际上就是稀疏数组的概念
length可以修改数组的长度,即可以删除元素
3.数组的增删arr.length = 2; // [1,undefined]
①添加元素:
②删除元素:arr.push(2); // 在末尾添加一个元素 [1,undefined,2] arr[arr.length] = (3) // 等价于push [1,undefined,2,3] arr.unshift(0) // 在头部添加一个元素 [0,1,undefined,2,3]
arr.pop(); // 删除掉最后一个元素 arr.length--; // 等价于pop arr.shift(); // 删除第一个元素 delete arr[4] // [0,1,undefined,2,undefined] 删除了第五个元素,使其变为undefined,但是仍然占位置,即长度不变length = 5
需要注意的是这样删除之后,4 in arr; // 为false,如果是用a[3] = undefined; 3 in a 就为true;
var a = Array("100",2,3,5); delete a[3];// ["100",2,3,undefined] console.log(a.length); // 长度仍然为4 console.log(3 in a); // 但是输出为false
4.数组的迭代
for(i in arr){ if(arr.hasOwnProperty(i){ console.log(arr[i]); } }
①使用一般的for循环
var a = [1,2,3,4]; for(var i = 0;i<a.length;i++) console.log(a[i]);
②for in 循环
for(i in a) console.log(a[i]); //注意i是索引 var b = 4 in a; // b为false 因为没有4这个索引
如果给Array.prototype.x = "inherited",这样for in出来的就会有"inherited",可以用
5.数组常用的方法①join:将数组元素转化为字符串
var arr = [1,2,3];
arr.join(); // "1,2,3" 默认以","连接
②reverse:将数组逆序arr.join("_") // "1_2_3" //创建重复字符串的函数 function repeatString (str,n) { return new Array(n+1).join(str); }
var arr = [1,2,3]; arr.reverse(); // 函数返回的是arr数组本身 console.log(arr); [3,2,1]
③sort: 将数组排序
④concat:合并数组var arr = [13,24,51,3]; arr.sort(); // 函数返回的也是arr数组本身 console.log(arr); // [13, 24, 3, 51]将数字转化为字符串之后比较ASCII码进行排序 // 真正的大小排序方法 var arr = [13,24,51,3]; arr.sort(function(a,b){ console.log(a,b); return a-b; // b-a表示从大到小排序 用到了冒泡排序法 }); console.log(arr); // [3,13,24,51]
⑤slice:返回部分数组var arr = [1,2]; arr.concat(3,4,5); // [1,2,3,4,5] 返回的是一个新的数组 console.log(arr); // [1,2]原数组不改变 arr.concat(3,[4,5]) // [1,2,3,4,5]数组被拉平了 arr.concat( [3,[4,5]] ) // [1,2,3,[4,5]]数组只会被拉平一次
var arr = [1,2,3,4,5] arr.slice(1,3) // [2,3] 起始索引值,结束索引值 为左闭右开区间 arr.slice(1) // [2,3,4,5] 不写第二个表示截取到最后一位 arr.slice(1,-1) // [2,3,4]支持负数 最后一位为-1 arr.slice(-4,-3) // [2] //slice返回的都是一个新的数组,即原数组不会发生改变
6.ES6中常用的新的数组方法