2021校招准备工作(持续更新)
JavaScript
学好JavaScript,至少把红宝书和犀牛书看三遍。
ES6的新语法
let
声明的变量只在 let 命令所在的代码块内有效
let
在代码块内有效,var在全局内有效
let
只能声明一次,var
可以声明多次
for循环适合使用let
for (var i = 0; i < 10; i++) {
setTimeout(function(){
console.log(i);
})
}
// 输出十个 10
for (let j = 0; j < 10; j++) {
setTimeout(function(){
console.log(j);
})
}
// 输出 0123456789
变量 i 是用 var 声明的,在全局范围内有效,所以全局中只有一个变量 i, 每次循环时,setTimeout 定时器里面的 i 指的是全局变量 i ,而循环里的十个 setTimeout 是在循环结束后才执行,所以此时的 i 都是 10。
变量 j 是用 let 声明的,当前的 j 只在本轮循环中有效,每次循环的 j 其实都是一个新的变量,所以 setTimeout 定时器里面的 j 其实是不同的变量,即最后输出 12345。
不存在变量提升
console.log(a); //ReferenceError: a is not defined
let a = "apple";
console.log(b); //undefined
var b = "banana";
const
声明一个只读的常量,一旦声明,常量的值就不能改变
ES6 明确规定,代码块内如果存在 let 或者 const,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。
解构赋值
- 数组模型的解构
- 对象模型的解构
Symbol
ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。
ES6 数据类型除了 Number 、 String 、 Boolean 、 Object、 null 和 undefined ,还新增了 Symbol 。
Map与Set
Map对象保存键值对,Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。成员值总是唯一的。
Reflect 与 Proxy
Proxy 用于对编程语言编程,对外界访问进行过滤和改写。Reflect是为了代替Object操作对象提供的新API,比如异常情况下Object.defineProperty会抛出错误,而Reflect.defineProperty会返回false
数值二进制前缀0b/0B和八进制前缀0o/0O
数组
- 数组创建:
Array.of
将参数中所有值作为元素形成数组。 - 转化数组:
Array.from
将类数组对象或可迭代对象转化为数组。
Array.map() :创建一个新数组,其结果是该数组中的每个元素调用一次提供的函数后的返回值。
Array.forEach() :对数组的每个元素执行一次给定的函数。
Object.assign()合并对象
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target);
// expected output: Object { a: 1, b: 4, c: 5 }
console.log(returnedTarget);
// expected output: Object { a: 1, b: 4, c: 5 }
箭头函数
基本语法:
参数 => 函数体
使用场景:
为了将外部 this 传递到回调函数中。当需要维护一个this上下文的时候,就可以使用箭头函数。
Iterator
迭代器 和 for...of
循环
Iterator
- 通过 Symbol.iterator 创建一个迭代器,指向当前数据结构的起始位置
- 随后通过 next 方法进行向下迭代指向下一个位置, next 方法会返回当前位置的对象,对象包含了 value 和 done 两个属性, value 是当前属性的值, done 用于判断是否遍历结束
- 当 done 为 true 时则遍历结束
const items = ["zero", "one", "two"];
const it = items[Symbol.iterator]();
it.next();
>{value: "zero", done: false}
it.next();
>{value: "one", done: false}
it.next();
>{value: "two", done: false}
it.next();
>{value: undefined, done: true}
#### ``for...of``循环
for…of 是 ES6 新引入的循环,用于替代 for…in 和 forEach() ,并且支持新的迭代协议。它可用于迭代常规的数据类型,如 Array 、 String 、 Map 和 Set 等等。
const nums = ["zero", "one", "two"];
for (let num of nums) {
console.log(num);
}
Class 类
class作为对象的模版被引入,可以通过class关键字定义类。
class的本质是function。
模块化
export与import
/*-----export [test.js]-----*/
let myName = "Tom";
let myAge = 20;
let myfn = function(){
return "My name is" + myName + "! I'm '" + myAge + "years old."
}
let myClass = class myClass {
static a = "yeah!";
}
export { myName, myAge, myfn, myClass }
/*-----import [xxx.js]-----*/
import { myName, myAge, myfn, myClass } from "./test.js";
console.log(myfn());// My name is Tom! I'm 20 years old.
console.log(myAge);// 20
console.log(myName);// Tom
console.log(myClass.a );// yeah!
Promise
Promise是一个对象,可以异步获取操作的信息。
Promise 异步操作有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。除了异步操作的结果,任何其他操作都无法改变这个状态。
then 方法
then 方法接收两个函数作为参数,第一个参数是 Promise 执行成功时的回调,第二个参数是 Promise 执行失败时的回调,两个函数只会有一个被调用。
在 JavaScript 事件队列的当前运行完成之前,回调函数永远不会被调用。
Generator/yield 用于异步编程
Decorator修饰器
许多面向对象的语言都有修饰器(Decorator)函数,用来修改类的行为。