web前端面试题
1.git 的命令有哪些?
git是:分布式版本控制器,GitHub就是使用git进行版本控制的代码管理网站
git 的基本工作流程:在工作区中通过git add文件名上传到暂存区然后通过git commit -m 提交信息 上传到git仓库
git init
//初始化
git status
//查看状态
git add .
//提交到暂存区
git commit -m "提交信息"
//向仓库提交代码
git log
//查看提交记录
git checkout文件名
//用暂存区的文件覆盖工作目录中的文件
git rm --cached 文件名
//将文件从暂存区删除
git reset --hard commitID
//将git仓库中指定的更新记录恢复出来,并覆盖暂存区和工作区目录
git branch
//查看分支
git branch 分支名
//创建分支
git checkout 分支名
//切换分支
git merge 来源分支
//合并分支(必须要在master分支上才可以合并develop分支)
git branch -d 分支名称
//删除分支(分支被合并后才可以删除 -D强制删除)
git stash
//存储临时改动
git stash pop
//恢复改动
在工作中,开发人员需要去工作其它项目时可以将现在的项目临时存储等 重新回到这个项目时再恢复
git pull 远程仓库地址 分支名
//拉取远程仓库中最新的版本
git push 远程仓库地址 分支名
//推送
git clone 仓库地址
//克隆
2. JavaScript中var,let,const区别?
- var 不存在块级作用域,let和const存在块级作用域。es6新增块级作用域由
{}
包裹。- var 声明的变量存在变量提升,let和const不存在。
- var 不存在暂时性死区,let和const存在。
- var 允许重复声明变量,let和const在同一作用域下不允许。
- var 和let 可以修改声明的变量,const不可以。
3. 解构赋值?
es6新增解构赋值,它可以让我们从数据中快速的获取到我们想要拿到的值。解构赋值有数组和对象的解构赋值,它要求=两边的结构必须一致,数组变量的取值由它的位置决定,对象需要变量名和属性名保持一致才可以获取到我们想要的值。
4.箭头函数与普通函数的区别?
1.箭头函数没有prototype原型属性。
2.箭头函数是匿名函数,不能作为构造函数,不能使用new。
3.箭头函数没有arguments,可以用rest参数...
解决。
4.箭头函数的this始终指向父级上下文,普通函数this指向调用了的那个对象。
5.箭头函数不能通过call() 、 apply() 、bind()
方法直接改变this指向。
5.class类?
ES5中还没有class类的概念如果要生成一个对象实例,需要先定义一个构造函数,然后通过new操作符来完成。
ES6引入了class
(类)这个概念,通过class
关键字可以定义类。ES6中的类其实就是构造函数的另外一种写法。
在类中声明方法的时候,不要给该方法加上function关键字,方法之间不要用逗号分隔,否则会报错。class不存在变量提升。
6.继承?
原型链继承:父类的实例作为子类的原型。
优点:可以调用原型方法
缺点:子类实例,不能向父类构造函数中传参数借用构造函数继承:在子类内,使用call()调用父类方法,并将父类的this修改为子类的this.相当于是把父类的实例属性复制了一份放到子类的函数内.
优点:子类实例可以向父类构造函数中传参。
缺点:不能继承原型上的方法组合继承:既能调用父类实例属性,又能调用父类原型属性。
ES6中的class类继承:
class 相当于es5中构造函数
class中定义方法时,前后不能加function,全部定义在class的protopyte属性中
class中定义的所有方法是不可枚举的
class中只能定义方法,不能定义对象,变量等
class和方法内默认都是严格模式
es5中constructor为隐式属性
子类 通过extends 继承父类
7.原型&原型链
原型
实例化对象和原型的
constructor
指向构造函数
构造函数的prototype
属性指向原型对象
实例化对象的__proto__
属性指向原型对象原型链
实例化对象的
__proto__
指向构造函数的prototype
构造函数prototype的__proto__
指向Object.prototype
Object.prototype的__proto__
指向null
8.Promise
是异步编程的一种方案,
promise
是一个对象,可以获取异步操作的消息,主要用于封装ajax
,异步计算。
promise
(首字母小写)对象指的是“Promise实例对象”
Promise
首字母大写且单数形式,表示“Promise构造函数”
Promises
首字母大写且复数形式,用于指代“Promises规范”
Promise
,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
从语法上说,promise
是一个对象,从它可以获取异步操作的的最终状态(成功或失败)。
Promise
是一个构造函数,对外提供统一的 API,自己身上有all、reject、resolve
等方法,原型上有then、catch等方法。
Promise的两个特点
1.Promise对象的状态不受外界影响
2.Promise的状态一旦改变,就不会再变
Promise的API:
then
方法就是把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数。
catch()
方法:它可以和 then 的第二个参数一样,用来指定 reject 的回调.当执行 resolve 的回调(也就是上面 then 中的第一个参数)时,如果抛出异常了(代码出错了),那么也不会报错卡死 js,而是会进到这个 catch 方法中。
all
方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。
race
的用法与 all 一样,只不过 all 是等所有异步操作都执行完毕后才执行 then 回调。而 race 的话只要有一个异步操作执行完毕,就立刻执行 then 回调。
9.async await
async await 是用来解决异步的,async函数是Generator函数的语法糖
在方法前面使用关键字async来表示,在函数内部使用 await 来表示异步
async函数返回一个 Promise 对象,可以使用then方法添加回调函数
当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。await关键字必须要出现在async修饰的函数中,否则报错。