Git+es6 面试题

183 阅读7分钟

(掌握)git reset、git revert和git checkout有什么区别?

命令作用域常用情景
git reset提交层面在私有分支上舍弃一些没有提交的更改
git reset文件层面将文件从缓存区中移除
git checkout提交层面切换分支或查看旧版本
git checkout文件层面舍弃工作目录中的更改
git revert提交层面在公共分支上回滚更改

#提交层面的操作

  1. reset 在提交层面上,reset将一个分支的末端指向另一个提交。这可以用来移除当前分支的一些提交。例如回退了两个提交。

    git reset HEAD~2
    
  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 +文件名

#(掌握)三、使用箭头函数应注意什么?

  1. 用了箭头函数,this就不是指向window,而是父级(指向是可变的)
  2. 不能够使用arguments对象
  3. 不能用作构造函数,这就是说不能够使用new命令,否则会抛出一个错误
  4. 不可以使用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]
    
  • SetMap

    1. ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
    2. ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
  • Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写

  • PromisePromise.allPromise.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栈的代码