数组

你有一个购物车、一个分数列表、一个群聊中所有人的名字。一个变量持有一个值,所以用这种方式存储一个列表意味着一堆独立的名字:price1、price2、price3,没有什么干净的方式来遍历它们或询问有多少个。数组就是解决方案。它在一个单一的名字下保存一个有序的值列表,并且它知道自己的长度,所以你可以添加到它、读取任何项目,以及在几行代码内遍历整个东西。
创建和读取数组
一个**数组**是一个有序的值列表。你用方括号写一个,值之间用逗号分隔:
const prices = [4, 9, 2, 7];这是一个变量,prices,包含四个数字。要读取一个单一的值,你使用它的位置,称为它的索引,在方括号中。让几乎所有人最初犯错的事情是:计数从零开始,而不是一。
const names = ["玛拉", "夸梅", "由纪"];
console.log(names[0]); // 玛拉
console.log(names[1]); // 夸梅要问一个数组有多少项,使用 .length:
console.log(names.length); // 3因为计数从零开始,最后一项位于 length - 1,而不是 length。所以最后一个名字在这里是 names[2],而 names[3] 会超出范围。
names[0] 读取一项,并记住计数从零开始,所以第一项是 [0],而不是 [1]。那个零让我困惑了一周,所以每当你的列表差一项时检查它。使用 .length 来计数项目,最后一个在 length - 1。 改变数组
数组是为了改变而制作的。你最常到达的两个在末尾添加或删除:push 添加一项,pop 删除最后一个。
const cart = ["苹果", "面包"];
cart.push("牛奶");
console.log(cart); // ["苹果", "面包", "牛奶"]
cart.pop();
console.log(cart); // ["苹果", "面包"]匹配的对在开头工作:unshift 添加到前面,shift 删除第一项。
cart.unshift("鸡蛋");
console.log(cart); // ["鸡蛋", "苹果", "面包"]你也可以通过分配到它的索引来直接替换一项:
cart[0] = "香蕉";
console.log(cart); // ["香蕉", "苹果", "面包"]要找到东西,includes 告诉你是或否,indexOf 告诉你它在哪里(或 -1 如果它不在那里):
console.log(cart.includes("苹果")); // true
console.log(cart.indexOf("面包")); // 2一件值得及早知道的事情:一个 const 数组仍然可以改变。 const 阻止你将名字 cart 重新分配给一个全新的数组,但它指向的列表仍然对 push、pop 和索引分配开放。
push 和 pop 在末尾添加和删除;unshift 和 shift 在开头做同样的事。分配到一个索引,如 cart[0] = "香蕉" 来替换一项,使用 includes 或 indexOf 来找一个。让我惊讶的部分:一个 const 数组仍然可以改变,因为 const 只阻止你将整个数组换成一个新的。 遍历数组
一旦你有一个列表,你通常想对每一项做什么。读过一个数组的最干净的方式是 for...of,它一次给你一项:
const prices = [4, 9, 2, 7];
for (const price of prices) {
console.log(price);
}
// 4
// 9
// 2
// 7你不管理一个索引或一个计数器。for...of 给你每个值有序,而你可以随意命名它(price)。如果你已经遇到循环,这是数组最友好的。
也有 forEach,它为每项运行一个小函数一次:
const names = ["玛拉", "夸梅", "由纪"];
names.forEach(function (name) {
console.log("你好 " + name);
});两者都遍历整个数组。当你想要干净地读取时到达 for...of,当你学习转换数组时你会再次遇到 forEach 和它的表亲。
for...of 是遍历数组的干净方式:它一次给你每项有序地,你永远不接触一个索引。forEach 为每项运行一个小函数一次,这也很方便。两者都通过整个列表,所以当你想直接读过它时选择 for...of。一旦你开始转换它们你会看到更多数组工具。 数组按引用保存
这是让人们惊讶的行为,所以早点看到它值得。当你复制一个数组变量到另一个名字时,你没有得到第二个数组。两个名字指向同一个。
const original = [1, 2, 3];
const copy = original;
copy.push(4);
console.log(original); // [1, 2, 3, 4]Push 到 copy 改变了 original,因为那里只曾经有一个数组。= 给第二个名字同一个列表,而不是它的一个新副本。这是人们说数组按引用保存时的意思:变量持有一个指向列表的指针,而不是列表本身。
要得到一个真实的、单独的副本,用 ... 传播数组到一个新的:
const original = [1, 2, 3];
const copy = [...original];
copy.push(4);
console.log(original); // [1, 2, 3],未被触及= 的数组变量不会制作第二个数组;两个名字指向同一个,所以通过任一的改变显示在两个中。这个比一次以上咬了我。当你想要一个真实单独的副本时,用 [...original] 传播它,这构建一个你可以独自改变的新鲜数组。 数组从这里去哪
一个数组给你一个在一个名字下的有序列表:用 [] 制作它,从零通过索引读它,用 push 和 pop 改变它,用 for...of 遍历它。一个通过这个章节进行的观念是数组按引用保存,所以复制变量共享列表而不是复制它。
自然下一步是把一个数组变成另一个,过滤一个列表,转换每一项,加它全部,不手工写循环。那是数组方法。当你需要通过一个名字而不是一个位置查找值时,对象是那个结构。

