前端面试题(持续更新中)

发布于:2022-11-14 ⋅ 阅读:(960) ⋅ 点赞:(0)

1.事件循环

  • js是单线程,
  • 看似同时做了多件事,实际上一件件来做的。
  • 同步和异步
  • setTimeout/setInterval/promise.then.catch nextTick
  • 当同步代码和异步代码相遇,总是先把异步线程挂起,先执行完主线程里面的同步代码
  • 异步代码推入了–任务队列,按照顺序挨个执行
  • setTimeout(1,0)setTimeout(2,10)setTimeout(3,0)
  • 宏任务和微任务
  • 先执行当下队列的微任务队列中的所有任务,再执行宏任务中的所有任务

在这里插入图片描述

1,3,6,4,5,2

2.await和async

  • 异步编程的终极解决方案
  • 之前有回调函数和链式调用
  • 用同步的方式写异步
  • 成对出现,

await后边跟一个promise对象
await上的代码是同步代码

1243

export default{
methods:{
async test(){
//await下面的代码是resolve之后才执行的代码,如果进行了reject就会抛出错误,
//要用try-catch 进行捕获
await new Promise(()=>{})
}
}
}

跨域解决方案CORS

1.fetch()是啥

jsonp-多用于新闻类网站,前端和后端配合,不是ajax

script标签获取js的请求地址,返回一段代码,代码里面恰好有数据

代理:生产环境代理,

和开发环境代理:webpack或者是中间件,

目的跨域:避开浏览器的同源策略-只针对浏览器,俩个不同源的后端是不受影响的,自己的前端请求自己的后端,代替我们发起请求到目标服务器,返回出去,再返回前端,

浅拷贝和深拷贝,实现深拷贝的方法

浅拷贝:只是把数据的所有数据引用下来,他引用的是地址,所以拷贝的数据和原来的数据,一个改变,俩个都会改变。

关于登录模块,我使用element-ui来构建页面,当用户输入完账号和密码,点击登陆的时候,就会验证账号和密码是否为空,是否符合规则,如果符合就会发送axios请求,

有一个功能是记住密码:我选择把账号密码存在cookie里面,因为cookie里面接收账号密码和存储时间的参数。

权限管理:首先登录页面和404页面是不需要权限的,

调用登陆的方法,会获取一个token,然后把token存储在localStorage或者是cookie里面,设置路由守卫router.beforeEach,里面接收三个参数to from,next,如果要去的是登陆页面,那么直接放行,否则就判断是否有token,

然后用户登陆的时候,并且会返回一个权限标识

axios是基于promise的ajax封装库。

css面试题

伪类和伪元素:

伪类:单引号,基于dom操作,给选择器添加一些动态效果,

例子: :nth-child: (2n) nth(2n+1)

:first-child

:last-child

伪元素:双引号,创建dom,增加元素,比如在做精灵图或者是小图标的时候用

垂直居中:

  1. 设置padding上下内边距

  2. line-height: 子元素和父元素高度相等(p标签自带margin,需要去掉),用于单行文字

  3. 弹性布局,flex-direction:column

    ​ jsutify-content:center

    4.绝对定位 父元素:position:absolute

    top:50%

    transform

main.js中

1.引入vue

2.引入store文件夹

3.引入路由文件夹

4.引入根组件App

5.引入全局组件

params参数和query参数的区别

params参数不能和path一起使用,需要name:属性

params参数需要占位

Vue.use全局注册
Vuex状态持久化

1.在页面刷新之前,把数据存在localStorage里面,刷新之后从localStorage里面读取它赋给vuex

存在localStorage里面的是字符串,所以要

用JSON.stringIfy()将数据转化为Json字符串

JSON.parse将json字符串转化为js对象

es6新特性
  1. 新增let和const 是块级作用域 没有变量提升,const只读常量,声明就必须要赋值 如果const是一个对象,那么他里面的值是可以修改的。
  2. 模板字符串,反引号表示。可以嵌入变量用${}

​ 3.箭头函数,没有自己的this,他的this是离自己最近的函数,如果没有就是window

4.解构赋值

5.拓展运算符

6.Set 数据结构,是一个构造函数,只允许里面的数据是唯一的

7 import和export

Promise

Promise是个构造函数

语法:1.接收一个函数做为参数

2.函数参数是俩个

new promise( (resolev,reject) = {})

Promise对象实例有俩个重要的属性

1.state:状态

2.result:结果

1.state:状态

pedding:等待,待解决

fullfiled:已成功

rejected:已拒绝 失败

2.Promise状态的改变

通过reject和resolve,只能有一种结果

3.promise的结果
4.构造函数的方法

then方法就是函数,参数和返回值

俩参数一个是成功回调,一个是失败回调

then的返回值是promise对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zDpdSi2r-1668402578660)(C:/Users/黄婷婷/AppData/Roaming/Typora/typora-user-images/image-20221028071658304.png)]

then方法返回的还是一个promise实例,状态时pedding

.then是同步的,但是.then里面的代码是异步的

用Promise解决回调地狱

系统事件,自定义事件

事件源,事件类型、事件回调

event

在组件里使用其他组件:1.引入 2.注册

axios二次封装
原因:需要一个 请求拦截器和响 应拦截器

首先创建一个axios实例

const requests = axios.create({
baseUrl:'',
timeOut:2000
})
请求拦截器
requests.interceptors.request.use(config) =>{
//config
return config
})

路由:path不可能和params一起使用

  //路由传递参数:

​      //第一种:字符串形式  "/search/" + this.keyword 是params传参  "?k=" + this.keyword是query传参

​      // this.$router.push("/search/" + this.keyword + "?k=" + this.keyword)  //编程式路由跳转

​      //第二种:模板字符串

​      // this.$router.push(`/search/${this.keyword}?k=${this.keyword}`)

​      //第三种:对象

​      // this.$router.push({ name: 'search', params: { keyword: this.keyword }, query: { k: this.keyword } })

​ //第二种:模板字符串

​ // this. r o u t e r . p u s h ( ‘ / s e a r c h / router.push(`/search/ router.push(/search/{this.keyword}?k=${this.keyword}`)

​ //第三种:对象

​ // this.$router.push({ name: ‘search’, params: { keyword: this.keyword }, query: { k: this.keyword } })


本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到