认识数组是引用类型

  1. var arr1 = [3, 5, 7, 8, 2]; // arr1 中存放的是地址
  2. var arr2 = arr1; // arr2 中存放的是地址
  3. arr2[0] = 5;
  4. arr1 === arr2; // => true
  5. arr1[0], arr2[0]; // => 5 5

由于数组本质上就是一个对象,数组的变量名存放的是该引用类型的地址,在赋值时,赋的也就是地址,即:在这个案例中 arr1、arr2 指向的是同一块内存空间。

使用 slice 克隆一个数组(产生一个全新的对象)

  1. var arr1 = [3, 5, 7, 8, 2];
  2. var arr2 = arr1.slice();
  3. arr2[0] = 5;
  4. console.log(arr1 === arr2); // false
  5. console.log(arr1[0], arr2[0]); // 3 5

在这个案例中,arr2 是一个由 arr1 克隆而来的全新的数组,arr1、arr2 指向的内存空间不再是同一块了。

数组求和

  1. var arr = [3, 7, 6, 4, 5];
  2. var sum = 0;
  3. for (var i = 0; i < arr.length; i++) {
  4. sum += arr[i];
  5. }
  6. sum; // => 25

逻辑很简单,就是遍历数组的每一项,然后将每一项累加到一个变量中。

二维数组

  1. // 3*3的二维数组
  2. var arr = [
  3. [1, 2, 3],
  4. [4, 5, 6],
  5. [7, 8, 9]
  6. ];
  7. // 输出二维数组的每一项
  8. for (var i = 0; i < arr.length; i++) {
  9. for (var j = 0; j < arr[i].length; j++) {
  10. console.log(arr[i][j]);
  11. }
  12. }
  13. // 对二维数组求和
  14. var sum = 0;
  15. for (var i = 0; i < arr.length; i++) {
  16. for (var j = 0; j < arr[i].length; j++) {
  17. sum += arr[i][j];
  18. }
  19. }
  20. console.log(sum); // 45

二维数组:数组中的每一项是一个数组。

需要知道如何遍历一个二位数组。

将数组的每一项进行字符串拼接

  1. var arr = [3, 4, 6, 1, 3];
  2. // 输出:3, 4, 6, 1, 3
  3. var str = "";
  4. for (var i = 0; i < arr.length; i++) {
  5. str += arr[i];
  6. if (i < arr.length ### 1) {
  7. str += ", ";
  8. }
  9. }
  10. str; // => "3, 4, 6, 1, 3"

使用 join 这个数组 api,可以更轻易地实现相同的效果。

数组.join(拼接的分隔符)

  1. var arr = [3, 4, 6, 1, 3];
  2. var str = arr.join(", ");
  3. str; // => "3, 4, 6, 1, 3"

join() 该函数返回一个字符串,按照我们指定的分隔符,对数组的每一项进行拼接。

数组1.concat(数组2)

  1. var arr1 = [34, 5, 2, 1];
  2. var arr2 = ["abc", "bcd"];
  3. var arr3 = arr1.concat(arr2);
  4. arr1; // => (4) [34, 5, 2, 1]
  5. arr2; // => (2) ["abc", "bcd"]
  6. arr3; // => (6) [34, 5, 2, 1, "abc", "bcd"]

数组1.concat(数组2),将 数组2 的所有元素拼接到数组1的末尾,产生一个新数组返回,该表达式不会对原数组造成任何影响。

提示用户输入数组的长度,以及数组每一项的值,然后输出该数组

  1. var len = +prompt("请输入数组的长度");
  2. if (isNaN(len) || len < 0) {
  3. console.log("输入有误");
  4. } else {
  5. //输入正确
  6. var arr = []; // var arr = new Array(len);
  7. for (var i = 0; i < len; i++) {
  8. // 提示用户输入数组的这一项的值
  9. arr[i] = prompt("请输入数组第" + (i + 1) + "项的值"); // 若 i + 1 不加括号 那么会先拼接 i 再拼接 1
  10. }
  11. console.log(arr);
  12. }

我们需要知道,大多数情况下,数组中的值不是我们自己写死的,而是用户输入的某些值。

初始化一个数字数组,然后求该数组所有项之和

  1. var arr = [1, 2, 3, 3, 3, 2, 1],
  2. sum = 0;
  3. for (var i = 0; i < arr.length; i++) {
  4. sum += arr[i];
  5. }
  6. console.log(sum); // 15

初始化一个数字数组,然后输出数组中所有的奇数

  1. var arr = [234, 6, 23, 211, 23];
  2. for (var index in arr) {
  3. if (arr[index] % 2 !== 0) {
  4. console.log(arr[index]);
  5. }
  6. }

初始化一个数字数组,然后输出数组中所有的素数

  1. var arr = [234, 2, 6, 23, 211, 23];
  2. for (var index in arr) {
  3. // 判断arr[index]是不是素数
  4. var isFind = false;
  5. for (var i = 2; i < arr[index] - 1; i++) {
  6. if (arr[index] % i === 0) {
  7. isFind = true;
  8. break;
  9. }
  10. }
  11. if (!isFind && arr[index] >= 2) {
  12. console.log(arr[index]);
  13. }
  14. }

让用户输入斐波拉契数列的长度,在控制台中打印该长度的斐波拉契数列

斐波拉契数列是这样一种数列:1 1 2 3 5 8 13 ……

数列前两位为1,第n位=第n-1位+第n-2位

  1. var len = +prompt("请输入斐波拉契数列的长度");
  2. if (isNaN(len) || len < 0) {
  3. console.log("输入有误");
  4. } else {
  5. //输入正确
  6. var arr = [];
  7. for (var i = 0; i < len; i++) {
  8. if (i === 0 || i === 1) {
  9. arr[i] = 1;
  10. } else {
  11. arr[i] = arr[i - 1] + arr[i - 2];
  12. }
  13. }
  14. console.log(arr);
  15. }

定义一个用户数组,数组的每一项是一个用户对象,用户对象中包含账号和密码,随意初始化一些对象放入数组中。然后提示用户输入账号和密码,判断是否登录成功

  1. var users = [{
  2. loginId: "abc",
  3. loginPwd: "123"
  4. },
  5. {
  6. loginId: "abc1",
  7. loginPwd: "1234"
  8. },
  9. {
  10. loginId: "abc2",
  11. loginPwd: "1235"
  12. },
  13. {
  14. loginId: "abc3",
  15. loginPwd: "1236"
  16. }
  17. ];
  18. var loginId = prompt("请输入账号");
  19. var loginPwd = prompt("请输入密码");
  20. // 查找问题
  21. var isFind = false;
  22. for (var i = 0; i < users.length; i++) {
  23. var u = users[i];
  24. if (u.loginId === loginId && u.loginPwd === loginPwd) {
  25. isFind = true;
  26. break;
  27. }
  28. }
  29. if (isFind) {
  30. console.log("登录成功");
  31. } else {
  32. console.log("登录失败");
  33. }

注意:不能使用 indexOf() 来查找。

  1. var index = user.indexOf({ // 返回值永远都是 -1
  2. loginId,
  3. loginPwd
  4. })

indexOf() 比较时用的是严格相等,而对象之间的比较比较的是地址,它们之间的地址是不可能相等的。

即:查找对象时,不能使用 indexOf()。但是,若查找基本类型,是可以使用 indexOf() 的,比如:数字、字符串、…

初始化一个5*5的二维数组,数组每一项是一个数字,计算对角线(两条)之和

  1. var arr = [
  2. [5, 2, 3, 1, 7],
  3. [8, 0, 6, 7, 8],
  4. [4, 0, 6, 2, 0],
  5. [3, 0, 6, 8, 1],
  6. [2, 0, 4, 5, 9]
  7. ];
  8. // 对角线之和
  9. var sum = 0;
  10. for (var i = 0; i < arr.length; i++) {
  11. // arr[i] 是一个数组
  12. for (var j = 0; j < arr[i].length; j++) {
  13. // arr[i][j]
  14. if (i === j || i + j === arr.length - 1) {
  15. sum += arr[i][j];
  16. }
  17. }
  18. }
  19. console.log(sum); // 44

难点:如何判断当前成员处于二维数组的对角线上?

  • i === j 主对角线
  • i + j === arr.length - 1 副对角线