# JavaScript 数组基础

# 课程目标

  • 学习如何定义数组,以及使用数组解构赋值技巧
  • 掌握数组基本属性:length,基本方法:pop,push,shift,unshift
  • 学会使用 forEach()遍历数组

# 数组定义

JavaScript 中的数组允许您在同一个变量中存储多个元素。您可以存储数字、字符串、布尔值、数组、对象等。这些可以在同一个阵列中混合。 这里有些例子:

const emptyArr = [];
const names = ["Zack", "Alex"];
const scores = [99, 72, 60, 12];
const mixValues = [10, false, "apple"];

# length 属性

您可以使用该.length 属性获取数组中的元素数。例如:

const emptyArr = [];
const names = ["Zack", "Alex"];
const scores = [99, 72, 60, 12];

emptyArr.length; // 0
names.length; // 2
scores.length; //4

# 获取数组元素和修改数组

您可以通过数组索引获取数组元素,通过使用方括号语法获得从数组中的元素[]与 index 从 0 开始。

const users = ["Sam", "Alex", "Charley"];
users[1]; //"Alex"

您可以使用.push()方法向数组添加元素,.pop()方法删除数组最后一个元素并返回该元素。.shift()方法从数组中移除第一个元素并返回移除的元素。 .unshift()方法将一个或多个元素添加到数组的开头。

const arr = [1, 2, 3];
arr.push(20); // 返回4(数组长度) 数组为:[1,2,3,20]
arr.pop(); // 返回20(最后一个元素) 数组为:[1,2,3]
arr.shift(); // 返回1 (第一个元素)数组为:[2,3]
arr.unshift(10); // 返回3(数组长度) 数组为:[10,2,3]

# 数组和常量

即使变量 users 是用 const 定义的 ,我们依然可以慈昂 users 中添加数据 那是因为 const 意味着您只能在定义变量时为其赋值一次。但这并不意味着变量是不可变的。它的内容可以改变。

将其声明为 const 您所问的有什么好处?好处是一旦您将其定义为数组,它将始终保持为数组,这意味着您可以安全地对其调用数组方法。但是,数组内容可以更改。

const users = [];
users.push("Amy"); //返回数组长度1
console.log(users); // ['Amy'] 数组改变了

# forEach 迭代数组

数组迭代是您将在 JavaScript 中使用的最重要的概念之一。

假设我们有一个成绩数组,你想循环(或迭代)这个数组中的每个项目。以下是在 JavaScript 中执行此操作的方法:

const users = ["Zack", "Alex"];

grades.forEach(function(grade) {
  console.log(grade);
});

此代码将把成绩数组中的每个成绩记录到控制台。所以你会得到

Zack
Alex

# 数组解构赋值

解构赋值语法是一种 Javascript 表达式。通过解构赋值, 可以将属性从数组中取出,赋值给其他变量,如下例子:

var user1, user2;
[user1,user2] = ['Amy', 'Jennie'];
console.log(user1); // Amy
console.log(user2); // Jennie

[user1, user2, ...restUsers] =['Amy', 'Jennie', 'Zack', 'Penny', 'Danny'];
console.log(user1); // Amy
console.log(user2); // Jennie
console.log(restUsers); // [Zack, Penny, Danny]

# 任务

下载 数组练习任务.zip (opens new window),您将得到 index.html,index.js,score.js,style.css 四个文件,保存到本地。

打开 score.js 文件,为了让您集中精力练习数组,请您按照以下要求完成任务,具体请您在 score.js 文件中实现函数功能

我们有一个嵌套数组,按学生成绩从高到低排列,每一个子数组包含了学生姓名和学生分数
它会作为参数 rows 传入下面需要实现的几个函数中

const data = [
  ["AMY", "100"],
  ["Lisa", "99"],
  ["Jackson", "98"],
  ["Jennie", "97"],
];

请您使用 forEach 方法完成该函数 renderScoreTableRows,使其返回以下 HTML:

<tr>
    <td>学生姓名</td>
    <td>学生总分</td>
</tr>

请你使用 数组解构 赋值完成 printFirst 函数,打印第一名成绩

  • 第一名名字赋值给变量 first_name,
  • 第一名成绩赋值给变量 first_score,
  • 并且使其返回以下 HTML:
<li>第一名:学生姓名,分数:学生分数</li>

请你使用 数组解构赋值 完成 printLast 函数,打印最后一名成绩

  • 最后一名名字赋值给变量 last_name,
  • 最后一名成绩赋值给变量 last_score,
  • 并且使其返回以下 HTML:
<li>最后一名:学生姓名,分数:学生分数</li>

请您使用完成该函数 printAverage 函数,打印学生的总平均分(精确到两位小数),使其返回以下 HTML:

<li>平均分:平均分分数</li>

如果您成功编写了函数功能,实现效果如下图所示

# 自测问题

  • 如果使用 const 定义了数组,那您还能改变数组吗?
  • 下面会在控制台打印什么结果?
const arr = [1, 2, 13, 15];
arr.push(20);
console.log(arr);
  • 下面 logGrades 函数会返回 10 还是 20?
function logGrades(grades) {
    grades.forEach(function(grade) {
        console.log(grade);
        return 10;
    });
    return 20;
}

# 进阶任务

如果你很快就完成上面的任务,可以去 LeetCode 上去多进行一些练习。

# 提交

把你今天觉得做得最好的代码放在 Github 后进行提交。

# 总结

依然把今天的学习用时,收获,问题进行记录。