与 Java 、PHP 等语言不同,在 JavaScript 中,数组其实是一种特殊的对象。 #### 数组的创建与读写 以下两种方式都可创建数组: ``` // 字面量方式,常用 var num = [1,5,6,10]; print(num.length); // 4 // 构造函数方式 var num = new Array(1,5,6,10); print(num.length); // 4 ``` 值得注意的是,JavaScript 中的数组数据可以是不同类型,它的语法相对宽松,例如可以指定不同类型数据`var example = [1,"Mike",true,null];`另外,可以通过`Array.isArray()`来判断一个对象是否是数组,例如: ``` var num = [1,5,6,10]; print(Array.isArray(num)); // true ``` 如何读写数组呢?可以使用循环。 ``` var num = [1,5,6,10]; for (var i = 0; i < num.length; i++) { console.log(num[i]+" "); } ``` #### 数组的深复制与浅复制 当我们把数组赋给另外一个数组,然后改变其中一个数组的值,另一数组也会随之改变,这就是数组的浅复制。而深复制指的就是不改变原来的数组而去创建一个新的数组,这种情况是经常使用的,为了不破坏原数组。下面的代码展示了这两种复制 ``` // 浅复制 var num = [1,2,3,4,5]; var newNum = num; num[0] = 10; console.log(newNum[0]); // 10 // 深复制 function copy (arr1,arr2) { for(var i=0;i= 60; } var grades = []; for(var i = 0;i < 11;i++){ grade[i] = Math.floor(Math.random() * 101); } var pass = grades.filter(passing); console.log("随机产生的 10 个同学的分数为:"); console.log(grades); console.log("及格的分数有:"); console.log(pass); ``` 上述代码的输出结果为 > 随机产生的 10 个同学的分数为: 21, 4, 89, 45, 5, 51, 71, 7, 46, 53, 47 及格的分数有: 89, 71 #### 二维数组 JavaScript 可以通过在数组里在嵌套一个数组来形成二维数组。 ``` var grades = [ [88,86,82], [91,82,83], [77,72,79], [86,80,82] ]; console.log(grades[1][2]); // 83 ``` #### 处理二维数组 对于二维数组的处理可以分为两种,一种按列访问,一种是按行访问。 按列访问,外层循环对应行,内层循环对应列。例如,上述的数组,每一行对应一个学生三门科目的成绩记录,可以通过相加所有成绩,然后除以科目数来得到该生的平均成绩。 ``` var grades = [ [88,86,82], [91,82,83], [77,72,79], [86,80,82] ]; var total = 0; var average = 0.0; for(var row = 0;row student 1 average: 85.33 student 2 average: 85.33 student 3 average: 76.00 student 4 average: 82.67 对于按行访问,则外层循环对应列,内层循环对应行,例如还是上述数组,现在的数组表示一个学生三场考试四门科目的各科分数,我们来求每场考试的平均成绩 ``` var grades = [ [88,86,82], [91,82,83], [77,72,79], [86,80,82] ]; var total = 0; var average = 0.0; //这里假设每场考试的科目都一样,所以可以通过grades[0].length来获取考试数量 for(var col = 0;col exam 1 average: 85.50 exam 2 average: 80.00 exam 3 average: 81.50 其实只要调整 for 循环的顺序就可以控制是按行还是按列来输出,此外,JavaScript 还可以处理一些参差不齐的数组,比如一个二维数组中的数组,有的是两个元素,有的是四个元素,并不是都相同,在这种情况下,JavaScript 依然可以处理运行而不报错,这是因为不管多或少,都可以通过 length 属性来计算。 #### 对象数组 如果你有阅读到这里,你应该可以发现上面的所有例子里数据类型都是基本数据类型,不是数字就是字符串。对象数组,顾名思义,就是数组里面的元素可以是对象,这个与 java 的语法很相似,基本上所有的编程语言都是相通的。看看下面这个例子: ``` function point(x,y){ this.x = x; this.y = y; } function show(arr){ for(var i=0;i Point 1: 1, 2 Point 2: 2, 4 Point 3: 8, 1 Point 4: 2, 9 也可以用之前的 push() 等操作方法来操作对象数组 ``` var p5 = new Point(11,13); point.push(p5); console.log("添加了 p5 后:"); show(point); point.shift(); console.log("删除第一个元素后:") show(point); ``` 输出结果为: > 添加了 p5 后: 1,2 2,4 8,1 2,9 11,13 删除第一个元素后: 2,4 8,1 2,9 11,13