(掌握)git reset、git revert和git checkout有什么区别?
| 命令 | 作用域 | 常用情景 |
|---|---|---|
| git reset | 提交层面 | 在私有分支上舍弃一些没有提交的更改 |
| git reset | 文件层面 | 将文件从缓存区中移除 |
| git checkout | 提交层面 | 切换分支或查看旧版本 |
| git checkout | 文件层面 | 舍弃工作目录中的更改 |
| git revert | 提交层面 | 在公共分支上回滚更改 |
#提交层面的操作
-
reset 在提交层面上,reset将一个分支的末端指向另一个提交。这可以用来移除当前分支的一些提交。例如回退了两个提交。
git reset HEAD~2 -
Revert撤销一个提交的同时会创建一个新的提交。这是一个安全的方法,因为它不会重写提交历史。比如,下面的命令会找出倒数第二个提交,然后创建一个新的提交来撤销这些更改,然后把这个提交加入项目中。
git revert HEAD~2相比
git reset,它不会改变现在的提交历史。因此,git revert可以用在公共分支上,git reset应该用在私有分支上。你也可以把
git revert当作撤销已经提交的更改,而git reset HEAD用来撤销没有提交的更改。
#(掌握)一、git pull 和 git fetch 之间有什么区别?
git pull:相当于是从远程获取最新版本并merge到本地git fetch:相当于是从远程获取最新版本到本地,不会自动merge
简单来说,git pull 是 git fetch + git merge。
#(掌握)二、如何在 Git 恢复先前的提交?
要撤销提交但保留更改:
git reset +当前文件
git status检测更改
要修改提交中的更改:git reset --hard +当前文件名
如果使用了 --hard,文件将重置到提交时的状态。
撤销提交但保留文件和索引:git reset --soft +文件名
#(掌握)三、使用箭头函数应注意什么?
- 用了箭头函数,this就不是指向window,而是父级(指向是可变的)
- 不能够使用arguments对象
- 不能用作构造函数,这就是说不能够使用new命令,否则会抛出一个错误
- 不可以使用yield命令,因此箭头函数不能用作 Generator 函数
#(掌握)四、介绍下 Set、Map的区别?
应用场景Set用于数据重组,Map用于数据储存
#1、Set
- 成员不能重复
- 只有键值没有键名,类似数组
- 可以遍历,方法有add, delete,has
#2、Map
- 本质上是健值对的集合,类似集合
- 可以遍历,可以跟各种数据格式转换
#(掌握)五、Promise构造函数是同步执行还是异步执行,那么 then 方法呢?
promise构造函数是同步执行的,then方法是异步执行的
#(掌握)六、setTimeout、Promise、Async/Await 的区别
事件循环中分为宏任务队列和微任务队列。
- 其中setTimeout的回调函数放到宏任务队列里,等到执行栈清空以后执行。
- promise.then里的回调函数会放到相应宏任务的微任务队列里,等宏任务里面的同步代码执行完再执行。
- async函数表示函数里面可能会有异步方法,await后面跟一个表达式。async方法执行时,遇到await会立即执行表达式,然后把表达式后面的代码放到微任务队列里,让出执行栈让同步代码先执行。
#(掌握)七、下面的输出结果是多少?
const promise = new Promise((resolve, reject) => {
console.log(1);
resolve();
console.log(2);
})
promise.then(() => {
console.log(3);
})
console.log(4);
答案:
1 2 4 3
Promise 新建后立即执行,所以会先输出 1,2,而 Promise.then() 内部的代码在 当次 事件循环的 结尾 立刻执行 ,所以会继续输出4,最后输出3。
#(掌握)十、请写出以下代码的答案,并解释为什么要提升(hoisting)?
console.log(a)
var a = 1
答案:undefined
提升存在的根本原因是为了解决函数互相调用的情况,如:
function test1{
test2()
}
function test2{
test1()
}
#(掌握)11、var、let、const之间的区别
var声明变量可以重复声明,而let不可以重复声明
var是不受限于块级的,而let是受限于块级
var会与window相映射(会挂一个属性),而let不与window相映射
var可以在声明的上面访问变量,而let有暂存死区,在声明的上面访问变量会报错
const声明之后必须赋值,否则会报错
const定义不可变的量,改变了就会报错
const和let一样不会与window相映射、支持块级作用域、在声明的上面访问变量会报错
#(掌握)12、get和post的区别
1、get和post在HTTP中都代表着请求数据,其中get请求相对来说更简单、快速,效率高些 2、get相对post安全性低 3、get有缓存,post没有 4、get体积小,post可以无限大 5、get的url参数可见,post不可见 6、get只接受ASCII字符的参数数据类型,post没有限制 7、get请求参数会保留历史记录,post中参数不会保留 8、get会被浏览器主动catch,post不会,需要手动设置 9、get在浏览器回退时无害,post会再次提交请求
什么时候使用post?
post一般用于修改服务器上的资源,对所发送的信息没有限制。比如
1、无法使用缓存文件(更新服务器上的文件或数据库) 2、向服务器发送大量数据(POST 没有数据量限制) 3、发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠
#(掌握)谈谈你对ES6的理解
-
let和const(不存在变量提升,暂时性死区,不允许重复声明, 块级作用域) -
结构赋值(数组,对象,字符串)
let [a, b, c] = [1, 2, 3]; -
Number数字类型扩展// 1. 数值分隔符 let budget = 1_000_000_000_000; budget === 10 ** 12 // true // 2. Number.isFinite()用来检查一个数值是否为有限的(finite) Number.isFinite(15); // true Number.isFinite(0.8); // true Number.isFinite(NaN); // false Number.isFinite(Infinity); // false // 3. 参数类型不是NaN,Number.isNaN一律返回false Number.isNaN(NaN) // true Number.isNaN("NaN") // false Number.isNaN(1) // false -
Function函数类型扩展// ES6 引入 rest 参数(形式为...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了 function add(...values) { let sum = 0; for (var val of values) { sum += val; } return sum; } add(2, 5, 3) // 10 // 箭头函数 var f = v => v; -
Array数组类型扩展// 1. 扩展运算符 console.log(...[1, 2, 3]); // 1 2 3 // 2. Array.from方法用于将两类对象转为真正的数组: // 类似数组的对象(array-like object) // 和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map) let arrayLike = { '0': 'a', '1': 'b', '2': 'c', length: 3 }; let arr = Array.from(arrayLike); // ['a', 'b', 'c'] // 3. Array.of()方法用于将一组值,转换为数组。 Array.of(3, 11, 8) // [3,11,8] -
Set和Map- ES6 提供了新的数据结构
Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。 - ES6 提供了
Map数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
- ES6 提供了新的数据结构
-
Proxy可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写 -
Promise(Promise.all、Promise.race) -
ES6 的
class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已 -
ES6 模块化(
import、export) -
ES6 引入了一种新的原始数据类型
Symbol,表示独一无二的值。ES5 的对象属性名都是字符串,这容易造成属性名的冲突,Symbol保证每个属性的名字都是独一无二的,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。 -
for-of(用来遍历数据—例如数组中的值。) -
新增模板字符串(为
JavaScript提供了简单的字符串插值功能)
#(掌握)async 和 await
主要考察宏任务和微任务,搭配promise,询问一些输出的顺序
原理:async 和 await 用了同步的方式去做异步,async 定义的函数的返回值都是 promise,await 后面的函数会执行,然后就会跳出整个 async 函数来执行后面js栈的代码