前言
FreeCodeCamp是一个以“帮助人们免费学习编程”为主旨的非营利性组织,其网站收录了众多训练式题目。作为前端入门有较大的帮助。
英文版(源)地址:www.freecodecamp.org/
中文社区:chinese.freecodecamp.org/forum/t/top…
此系列博文为相关知识点记录,算是自己对前端入门的一个回顾。有空还是强烈建议去刷一遍原题+知识点
数据存储
在 JavaScript 和其他编程语言中,我们都可以以多种方式存储和访问数据。本节将教你如何使用数组(array),以及如何访问和复制数组中的信息。本节还将教你如何用点符号和方括号符号来操作和访问 JavaScript 对象(object)中的信息。在你完成本节之后,你应该掌握数组和对象的基本属性以及它们之间的区别,并且掌握如何选择它们来实现给定的目标。
开始
- 使用数组存储数据集合
- 所有数组都有一个长度(length)属性。你可以简单地使用Array.length方法来访问它。
- 使用方括号访问数组的内容
- 在一个数组结构中,其内部的每个元素都有一个与之对应的索引(index)。索引是该元素在数组中的位置,可被用于引用该元素。但需要注意的是,JavaScript 数组的索引是从0开始的(zero-indexed),即一个数组的第一个元素是在数组中的第 0 个位置,而不是第 1 个位置。
- 要从一个数组中获取一个元素,我们可以在一个数组变量名的后面加一个使用“方括号”括起来的索引。这叫做方括号符号(bracket notation)。
- 使用 push() 和 unshift() 添加项目到数组中
- 对一个数组调用这两个方法都可以将输入的元素插入到该数组中;push()方法将元素插入到一个数组的末尾,而unshift()方法将元素插入到一个数组的开头
- 使用 pop() 和 shift() 从数组中删除项目
- 使用pop()和shift()来移除输入的数组的第一个元素和最后一个元素,并将这两个被移除的元素赋值给对应的变量,使得返回的数组包含它们的值。
- 使用 splice() 删除项目
- splice()让我们可以从数组中的任意位置移除任意数量的连续的元素。
- splice()最多可以接受 3 个参数,但现在我们先关注前两个。splice()接收的前两个参数基于调用splice()数组中元素的索引。记住,数组的索引是从 0 开始的(zero-indexed),所以我们要用0来指示数组中的第一个元素。splice()的第一个参数代表从数组中的哪个索引开始移除元素,而第二个参数指示要从数组中删除多少个元素
- splice()不仅从被调用的数组中移除元素,还会返回一个包含被移除元素的数组:
- 使用 splice() 增加项目
- 除了移除元素,我们还可以利用它的第三个参数来向数组中添加元素。第三个参数可以是一个或多个元素,这些元素会被添加到数组中。这使我们能够便捷地将数组中的一个或一系列元素换成其他的元素
function htmlColorNames(arr) {
// 请把你的代码写在这条注释以下
arr.splice(0, 2, 'DarkSalmon', 'BlanchedAlmond')
// 请把你的代码写在这条注释以上
return arr;
}
- 使用 slice() 拷贝数组项目
- slice()并不修改数组,而是复制或者说提取(extract)给定数量的元素到一个新数组里,而调用方法的数组则保持不变。slice()只接受 2 个输入参数—第一个是开始提取元素的位置(索引),第二个是结束提取元素的位置(索引)。slice 方法会提取直到该索引的元素,但被提取的元素不包括该索引对应的元素
- 使用扩展运算符复制数组
- ES6 中又新引入了一个简洁且可读性强的语法展开运算符(spread operator),它能让我们方便地复制数组中的所有元素。展开语法是这样的:...
function copyMachine(arr, num) {
let newArr = [];
while (num >= 1) {
// 请把你的代码写在这条注释以下
newArr.push([...arr]);
// 请把你的代码写在这条注释以上
num--;
}
return newArr;
}
// 你可以修改这行代码来测试不同的输入:
console.log(copyMachine([true, false, true], 2));
- 组合使用数组和扩展运算符
- 展开运算符的另一个大用处是合并数组,或者将某个数组的所有元素插入到另一个数组的任意位置。用传统的语法我们也可以连接两个数组,但只能两个数组首尾相接。而展开语法能使下面的操作变得极其简单:
let thisArray = ['sage', 'rosemary', 'parsley', 'thyme'];
let thatArray = ['basil', 'cilantro', ...thisArray, 'coriander'];
// thatArray 现在等于 ['basil', 'cilantro', 'sage', 'rosemary', 'parsley', 'thyme', 'coriander']
- 使用 indexOf() 检查元素是否存在
- indexOf()。这个方法让我们可以便捷地检查某个元素是否存在于一个数组中。indexOf()方法接受一个元素作为输入参数,并返回该元素在数组中的位置(索引);若该元素不存在于数组中则返回-1
let fruits = ['apples', 'pears', 'oranges', 'peaches', 'pears'];
fruits.indexOf('dates') // 返回 -1
fruits.indexOf('oranges') // 返回 2
fruits.indexOf('pears') // 返回 1,即第一个出现的 'pears' 元素在数组中的索引为 1
- 使用 For 循环迭代数组的所有项
function greaterThanTen(arr) {
let newArr = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] > 10) {
newArr.push(arr[i]);
}
}
return newArr;
}
greaterThanTen([2, 12, 8, 14, 80, 0, 1]);
// 返回 [12, 14, 80]
- 创建复杂的多维数组
- 数组的一个强大的特性是,它可以包含其他数组,甚至完全由其他数组组成。我们已经在上一个挑战中看到了包含数组的数组,但它还算是比较简单的。数组中的数组还可以包含其他数组,数组中是可以嵌套任意层的数组的。从而数组可以被用来实现非常复杂的叫做多维(multi-dimensional)或嵌套(nested)数组。
let nestedArray = [ // 顶层,或第 1 层——最外层的数组
['deep'], // 数组中的数组,第 2 层
[
['deeper'], ['deeper'] // 第 3 层嵌套的两个数组
],
[
[
['deepest'], ['deepest'] // 第 4 层嵌套的两个数组
],
[
[
['deepest-est?'] // 第 5 层嵌套的一个数组
]
]
]
];
- 将键值对添加到对象中
- 对象(object)本质上是键值对(key-value pair)的集合,或者说,一系列被映射到唯一标识符(叫做属性(property)或者键(key))的数据
- 数据结构基础:修改嵌套在对象中的对象
- 对象中也可以嵌套任意层的对象。对象的属性值可以是 JavaScript 支持的任意类型,包括数组和其他对象。
- 使用方括号访问属性名称
- 使用 delete 关键字删除对象属性
- 检查对象是否具有某个属性
- 个是hasOwnProperty()方法,另一个是in关键字。如果我们有一个users对象,它有一个Alan属性,我们可以用以下两种方式之一来检查该属性在对象中是否存在:
users.hasOwnProperty('Alan');
'Alan' in users;
// 都返回 true
- 使用 for...in 语句迭代对象
- 跟数组不同,对象中的键是无序的,因此一个对象中某个键的位置,或者说它出现的相对顺序,在引用或访问该键时是不确定的。
let users = {
Alan: {
age: 27,
online: false
},
Jeff: {
age: 32,
online: true
},
Sarah: {
age: 48,
online: false
},
Ryan: {
age: 19,
online: true
}
};
function countOnline(obj) {
// 请把你的代码写在这条注释以下
var count = 0;
// console.log(users.Alan.online);
for(let user in obj){
console.log(obj[user]['online']);
if(obj[user]['online']) count++;
}
return count;
// 请把你的代码写在这条注释以上
}
// console.log(countOnline(users));
- 使用 Object.keys() 生成对象所有键组成的数组
- 还可以输入一个对象作为参数来调用Object.keys()方法,使其生成一个包含对象中所有键的数组。这会返回一个由对象中所有键的名称(字符串)组成的数组。再次说明,这个数组中的项的顺序是不确定的。
- 请你完成getArrayOfUsers函数,使其返回一个包含输入的对象的所有属性的数组。
let users = {
Alan: {
age: 27,
online: false
},
Jeff: {
age: 32,
online: true
},
Sarah: {
age: 48,
online: false
},
Ryan: {
age: 19,
online: true
}
};
function getArrayOfUsers(obj) {
// 请把你的代码写在这条注释以下
return Object.keys(obj);
// 请把你的代码写在这条注释以上
}
- 修改存储在对象中的数组
请你看一下代码编辑器中我们提供的对象。user对象包含 3 个键。data对象包含 5 个键,其中一个包含一个friends数组。从这个例子你可以看到对象作为数据结构是多么的灵活。我们已经写了addFriend函数的一部分,请你完成这个函数,使其接受一个user对象,将friend参数中的名字添加到user.data.friends数组中并返回该数组。
let user = {
name: 'Kenneth',
age: 28,
data: {
username: 'kennethCodesAllDay',
joinDate: 'March 26, 2016',
organization: 'freeCodeCamp',
friends: [
'Sam',
'Kira',
'Tomo'
],
location: {
city: 'San Francisco',
state: 'CA',
country: 'USA'
}
}
};
function addFriend(userObj, friend) {
// 请把你的代码写在这条注释以下
userObj['data']['friends'].push(friend);
return userObj['data']['friends'];
// 请把你的代码写在这条注释以上
}
console.log(addFriend(user, 'Pete'));