2021前端面试题

  • 基础知识与素养
  • JS基本功训练与思考
  • 程序设计的渗透与应用
  • 业务技巧的积累与训练
  • 生产力转换
  • 项目的组织架构
  • 转换专业人才的全面生产力

什么样的技术水平决定了你应该学习什么样的知识与技术,什么样的知识与技术水平决定了你到什么样的公司,到什么样的公司决定了你在什么样社会层次,什么样的社会层次决定了你的眼界与发展的高度。

试题来源

一 面试题:

0、*浮动的影响

① 浮动元素不占位,脱离文档流,可以达到文字环绕的排版效果,也会引起标准流div被浮动元素遮挡
② 父元素高度塌陷

1、*BFC:解决因为浮动引起的问题 BFC

1)触发BFC的条件

① body元素
② float非none的
③ 绝对定位的(position:fixed/absolute)
④ display: flex/inline-block/table-cells
⑤ overflow非visible

2)BFC的特性

同一BFC内margin折叠

3)BFC的作用

① 清除浮动(解决父元素高度塌陷)
② 解决元素被浮动元素覆盖(可用于做左右两列布局,左宽度固定,右自适应)

2、*完整的web请求(返回了html)浏览器访问地址

3、*页面渲染HTML过程

在这里插入图片描述

4、*get、post请求的区别,解释get请求可以被缓存(浏览器决策)、不想缓存如何做:

1)在ajax发送请求前加上xmlHttpRequest.setRequestheader(‘Cache-Control’,“no-cache”) 或者请求头(“if-Modified-Since”:“0”)
2)在服务端加 header("cache-Control:no-cache,must-revalidate)
3)增加一个唯一值的参数:一般是使用timestamp = new Date().getTime() (推荐)
(场景:请求服务器资源,如下载文件,文件更新时)

5、下载文件,window.open、download属性依然不下载(必须同源)

6、反向代理是什么、作用

1)反向代理

反向代理(Reverse Proxy)方式是指:代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从内部网络上服务器得到的结果返回给 Internet 上请求连接的客户端。此时代理服务器对外就表现为一个服务器,反向代理服务器对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。
反向代理的作用:
保证内网的安全,可以使用反向代理提供 WAF 功能,阻止 web 攻击
负载均衡,通过反向代理服务器来优化网站的负载。

7、**vue项目性能优化(小野森森)

  1. vue-for为什么要加key(更快定位数据与diff)
  2. 模块化、组件化(封装高度复用性的模块:http、拆分高度复用性的组件、组件可配置性强)
  3. 路由懒加载/动态加载组件 :首屏加快渲染
  4. productionSourceMap设置false:否则,生产map文件,打包后体积变大,且能定位源码(泄漏源码逻辑)【在bulid/config/index文件下】
  5. productionGzip设置true:gzip压缩、打包体积更小
  6. keep-alive:缓存组件,用keep-alive包裹router-view
  7. 插件CDN:vue-router、axios可以用link方式引入到html中,并在configureWebpack里注册,减少打包(也可以将这些js、css文件下载,放在自己的CDN、以防官方服务器挂了)
  8. 图片CDN、图片懒加载(vue-lazyLoad插件,v-lazy指令)、使用CSS图标(在main.js里全局引入iconfont字体图标)
  9. 组件按需导入: import { Button, Input } from ‘element-ui’

8、**webpack打包工具 (小野森森)【考配置流程、loader的作用】

1、作用①:压缩代码,混淆js代码;
2、作用②:浏览器不支持ES5以上的语法,webpack可以安装一系列依赖包将之翻译成ES5
3、作用③:将less、sass编译成css
4、所需依赖:

  1. 【三大件】webpack、webpack-cli(脚手架)、webpack-dev-server(开发者服务器插件)
  2. 【六件套】处理ES6 ES7… 装饰器:
    . babel-loader@7、babel-core、babel-preset-env
    . babel-plugin-transform-runtime
    . babel-plugin-transform-decorators、 babel-plugin-transform-decorators-legacy
  3. 【四大件】处理样式sass:
    . sass-loader、node-sass、css-loader、style-loader ( postcss-loader autoprefixer )
  4. 处理模板:ejs-loader
  5. 处理HTML: html-webpack-plugin

5、安装指令:

  • –save-dev 简写 -D (安装在开发环境下的,线上不跑)
  • –save 简写 -S (安装在生成环境下的)

6、配置安装包 webpack.config文件
特*:所有plugin结尾的依赖,一般要require导入、babel则不用
plugins: [ new HtmlWebpackPlugin( { } ) ]
7、 用命令跑配置文件webpack.config,在package.json的script里(跑脚本)

9、***Promise(小野森森)

引子:一个高阶函数(参数里有函数),返回一个fn,在fn里有条件的执行回调方法(闭包)

const doSth = (t) => {return () => {if (--t === 0) {print1(() => {print2(() => {print3()})})}}
}
const print1 = (cb) => {console.log('第一次打印')// 打印出这句话后执行cbcb()
}
const print2 = (cb) => {console.log('第二次打印')cb()
}
const print3 = () => {console.log('第三次打印')
}
const fn = doSth(3, print1)
fn()
fn()
fn()

1. 基本

目的:需要处理异步请求的嵌套,比如,先根据接口判断是否重复,拿到res后再进行下一次请求
① Promise是解决异步流程化的手段,Promise不是异步
② Promise是构造函数,需要new
③ Promise的唯一参数,executor函数,有参数resolve、reject
executor在new Promise的时候调用
⑤ executor是同步执行的,而then是异步调用的
⑥ 每个返回的Promise都有一个then方法,方法有2个回调函数cb,第一个cb的参数需由resolve执行时传入,resolve时执行第一个cb,reject时执行第二个cb
没有第二个callback的时候可以通过.catch,优先走then里的第二个cb,且无论是第几个then,总是优先于catch
⑧ reject能做的,throw new Error也可以
⑨ 每个then可以再继续.then下去 (在第一个Promise里返回Promise)

⑤ ↓

let promise = new Promise((resolve, reject) => {console.log(1)reject(3)
})
promise.then((res) => {console.log('打印', res)
}, (err) => {console.log(err)
})
console.log(2)
// 打印 1 2 3

⑥ ↓

let promise = new Promise((resolve, reject) => {resolve('结果')
})
promise.then((err) => {console.log('打印', err)
})
// 打印 结果
let promise = new Promise((resolve, reject) => {reject('服务异常')
})
promise.then((res) => {console.log('打印', res)
}, (err) => {console.log(err)
})
// 服务异常

⑦ ↓

let promise = new Promise((resolve, reject) => {reject('服务异常')
})
promise.then().catch((err) => {console.log(err)
})
// 服务异常
let promise = new Promise((resolve, reject) => {reject('服务异常')
})
promise.then(() => { }, (err) => {console.log('优先then', err)
}).catch((res) => {console.log(res)
})
// 优先then 服务异常
let promise = new Promise((resolve, reject) => {reject('服务异常')
})
promise.then(() => { }).then().then(() => { }, (err) => {console.log('无论第几个then,总是优先', err)
}).catch((res) => {console.log(res)
})
// 无论第几个then,总是优先 服务异常

⑧ ↓

let promise = new Promise((resolve, reject) => {throw new Error('抛出错误')
})
promise.then(() => { }).then().then(() => { }, (err) => {console.log('无论第几个then,总是优先', err)
}).catch((err) => {console.log(err)
})
let promise = new Promise((resolve, reject) => {throw new Error('抛出错误')
})
promise.then(() => { }).catch((err) => {console.log(err)
})

在这里插入图片描述
⑨ ↓

let promise = new Promise((resolve, reject) => {resolve('结果1')
})
promise.then((res) => {console.log('打印', res)return new Promise((resolve, reject) => {resolve('结果2')})
}).then((res) => {console.log('打印', res)
})
// 打印 结果1
// 打印 结果2

2. 语法糖Promise.resolve Promise.reject

相当于是 new Promise(…)

let promise = new Promise((resolve, reject) => {resolve('结果1')
})
promise.then((res) => {console.log('打印', res)return Promise.resolve('成功啦')
}).then((res) => {console.log(res)
})
// 打印 结果1
// 成功啦

3. Promise.all(通常用于等待多个异步任务完成)

① Promise.all接收iterable类型数据(如Array、Set、Map),数据的每一项可以是Promise也可以不是
② 返回值是Promise,因此可以.then。 如果resolve,则将iterable的每个Promise resolve的data依次放入数组
若参数为空数组,返回空数组
只要其中一个Promise的状态rejected了,整个Promise.all的状态便rejected,失败的原因是第一个失败的Promise的结果
⑤ 使用场景:一个页面初始化需要请求多个接口,只要任何一个接口失败,便认为初始化是失败的,需要重新请求

4. Promise.race

① 谁先完成,就只返回那个Promise的结果,且无论成功或失败,都会返回
② 若参数为空数组,Promise.race的结果永远处于pending状态,看起来是什么都没返回
③ 可以比较资源或接口的响应速度

5. async、await

① await是一个操作符,她等待一个Promise对象产出结果,如果这个结果是rejected,就会抛出异常
② async函数返回一个pending状态,这本身并没有什么意义

10、***函数防抖与节流小野森森

1、函数防抖

1)含义:

① 延迟执行(时间被触发n秒后再执行的回调)
② 如果在n秒内再次触发,则重新开始计时

2)场景:

① ajax请求数据(比如下拉刷新、首次延迟)
② ajax提交数据(提交、支付等按钮重复点击、首次不延迟)
③ 表单校验(input输入时,延迟验证,首次也延迟)否则可能无法得到校验通过的结果

3)实现:

① clearTimeOut的返回值是计时器id,此时t还有值 只有t = null,t才会变成null
② 这里不要乱用箭头函数
③ 不要debugger调试
④ 思路:考虑首次不延迟的情况→没有定时器则为首次,因此time后要t = null
(time内频繁触发,计时器会频繁重新开始计时)

domObj.onclick = debounce(myFn)
const myClick = () => {console.log('tag', Date.now())
}
var debounce = function (fn, time, triggleNow) {var t = null // 只有第一次点击会走这里var debounced = function () {var _self = this,args = arguments;if (t) {console.log('t0', t)clearTimeout(t)// 清除定时器后,t的值还在 // 除非赋值null,否则随着点击次数而增加}console.log('t1', t)if (triggleNow) {var exec = !tconsole.log('t2', t)t = setTimeout(function () {t = null}, time)// 到这里 t必有idconsole.log('t3', t)if (exec) {fn.apply(_self, args)}} else {console.log('t4', t)t = setTimeout(function () {fn.apply(_self, args)}, time)}}debounced.remove = function () {clearTimeout(t)t = null}return debounced}
const box = document.getElementsByClassName('box')[0]
box.onclick = debounce(myClick, 1000, true)

表单输入

const oInput = document.getElementById('input')
const myCheck = function () {var val = this.valueif (val.length < 6) {console.log('校验失败')} else {console.log('校验成功')}
}
oInput.onkeyup = debounce(myCheck, 1000, true)
// 只会打印校验失败,之后即使长度满足了,由于在time内频繁键入,也不会再触发了

若函数有返回值

var debounce = function (fn, time, triggleNow) {var t = null,res// console.log('t', t)// time内多次点击,只有初次会走这里var debounced = function () {var _self = this,args = arguments;if (t) {console.log('t0', t)clearTimeout(t)// 清除定时器后,t的值还在 // 除非赋值null,否则随着点击次数而增加}console.log('t1', t)if (triggleNow) {var exec = !tconsole.log('t2', t)t = setTimeout(function () {t = null}, time)// 到这里 t必有idconsole.log('t3', t)if (exec) {res = fn.apply(_self, args)}} else {console.log('t4', t)t = setTimeout(function () {res = fn.apply(_self, args)}, time)}return res // 假若函数有返回值}debounced.remove = function () {clearTimeout(t)t = null}return debounced}

2、 函数节流

1)含义场景:

事件被触发、n秒内只且必执行一次事件处理函数 ,可用于输入验证、ajax提交

2) 实现:

function throttle(fn, delay) {// 闭包var t = null,begin = new Date().getTime()return function () {var _self = this,args = arguments,cur = new Date().getTime()clearTimeout(t)if (cur - begin >= delay) {console.log(1)// 隔了很久后再在原来基础上输入,会先走1,再走2fn.apply(_self, args)begin = cur} else {console.log(2)t = setTimeout(function () {fn.apply(_self, args)}, delay)}}
}

对比:
n秒内频繁触发,永远不让执行,用函数防抖
n秒内频繁触发,有且执行一次,用函数节流

11、 事件循环

① 消息队列/任务队列/事件队列是一样的,即异步任务相关的队列(先进先出/排队)
② 异步任务有:(队列中的消息对应着事件,因此叫事件循环,循环读取消息队列)

  1. 普通事件:click、resize → DOM操作对应DOM事件
  2. 资源加载:load、error → 资源加载操作对应加载事件
  3. 定时器:setInterval、setTimeout

③ 详细步骤:

  1. 所有同步任务都在主线程上执行,形成一个执行栈
  2. 主线程之外,还存在一个"消息队列"。只要异步操作执行完成,就到消息队列中排队
  3. 一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取消息队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行
  4. 主线程不断重复上面的第三步

从代码执行顺序的角度来看,程序最开始是按代码顺序执行代码的,遇到同步任务,立刻执行;遇到异步任务,则只是调用异步函数发起异步请求。此时,异步任务开始执行异步操作,执行完成后到消息队列中排队。程序按照代码顺序执行完毕后,查询消息队列中是否有等待的消息。如果有,则按照次序从消息队列中把消息放到执行栈中执行。执行完毕后,再从消息队列中获取消息,再执行,不断重复。

12、宏任务、微任务

① 微任务早于宏任务
② 多个定时器(内含同步、微任务),按定时器顺序完整执行完
在这里插入图片描述

13、this指向

1:this永远指向一个对象;
2:this的指向完全取决于函数调用的位置
针对以上的第一点特别好理解,不管在什么地方使用this,它必然会指向某个对象;确定了第一点后,也引出了一个问题,就是this使用的地方到底在哪里,而第二点就解释了这个问题,但关键是在JavaScript语言之中,一切皆对象,运行环境也是对象,所以函数都是在某个对象下运行,而this就是函数运行时所在的对象(环境)。

11、****设计模式

1)单例模式

12、***原型链

13、***闭包

14、****事件循环

15、**vue路由模式、前端单页面路由跳转实现的原理是什么

1、Vue模板编译(小野森森)

11、Vue2、3的区别(小野森森)

  1. vue2.0:options API (低内聚)
  2. vue3.0:可以将方法提出来
    在这里插入图片描述

12、**call、bind、apply

  • 改变this指向(第一个参数)
  • 只有applay的参数是数组
  • 只有bind返回的是函数
    案例
const doSth = (t, cb) => {return () => {if (--t === 0) {cb()}}
}
const print1 = (cb) => {console.log('第一次打印')// 打印出这句话后执行cbcb()
}
const fn = doSth(3, print1)
fn()
fn()
fn()
const doSth = (t, cb) => {return () => {if (--t === 0) {cb()}}
}
const print1 = (cb) => {console.log('第一次打印')// 打印出这句话后执行cbcb()
}
const print2 = (cb) => {console.log('第二次打印')cb()
}
const fn = doSth(3, print1.bind(null, print2))
fn()
fn()
fn()

13、401:没有提供认证信息。请求的时候没有带上 Token 等

  1. 预编译、作用域、闭包
  2. 内容字数位置,宽度高度不定,只展示2行,多余内容…
  3. 中断ajax请求(超时、手动中断)后端响应超时:吉行无忧
  4. 事件代理的使用场景
  5. vue核心功能

微信网页版:Http 请求报文头部信息,其中 Connection: keep-alive 意味着这次请求结束后不会关闭 TCP 连接

待续…

es6程序设计
websocket
面试题
vue3.0+ts
响应式布局
vue3.0星座项目
使用开发者工具

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

glog日志库使用笔记

日志能方便地诊断程序原因、统计程序运行数据&#xff0c;是大型软件系统必不可少的组件之一。glog 是google的开源日志系统&#xff0c;相比较log4系列的日志系统&#xff0c;它更加轻巧灵活。 在Github上下载glog&#xff0c;解压后用CMake生成VS2017工程&#xff08;默认生成…

elementPlus关闭弹窗,页面原先滚动条消失

一开始以为是弹窗内容超过一屏引起&#xff0c;改为一屏内也不能解决。 打开控制台&#xff0c;发现弹窗后自动给body标签加上了类el-popup-parent–hidden&#xff0c;关闭后也没去除&#xff0c;因此手动删除该类。 document.getElementsByTagName(body)[0].className ;

在Windows下如何创建虚拟环境(默认情况下)

很多小伙伴平时在使用Python的时候&#xff0c;有的项目需要使用Python2来进行开发&#xff0c;有的项目则是需要Python3来进行开发。当不清楚怎么分开环境的时候&#xff0c;此时两个环境开始打架&#xff0c;彼此傻傻分不清楚。虚拟环境作为隔离的利器应运而生&#xff0c;其…

selenium python 入门-元素定位

环境搭建 安装教程 http://www.testclass.net/selenium_python/install-selenium/ chrome浏览器 还需要下载chrome driver 把下载的chromedriver .exe放到chrome安装目录下的Application目录下和 python所在的安装目录下&#xff0c;比如我的目录是C:\Program Files (x86)\Goog…

DPDK helloworld 源码阅读

在 DPDK Programmers Guides 中的 EAL 一篇中有一个图可以很清晰地看到一个DPDK的应用程序的大致执行思路&#xff1a; 初始化检查CPU支持、微架构配置等完成后&#xff0c;执行main()函数。 第一步是 rte_eal_init()&#xff0c;核心初始化和启动。其中线程使用的是pthread库&…

看了吗网址链接

sklearn实战-乳腺癌细胞数据挖掘&#xff08;博主亲自录制视频&#xff09; https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare # -*- coding: utf-8 -*- ""&qu…

JMeter 性能测试进阶实战

课程简介 本课程制作的主要目的是为了让大家快速上手 JMeter&#xff0c;期间穿插了大量主流项目中用到的技术&#xff0c;以及结合当今主流微服务技术提供了测试 Dubbo 接口、Java 工程技术具体实施方案&#xff0c;注重实践、注意引导测试思维、拒绝枯燥的知识点罗列、善于用…

JavaScript高级程序设计阅读笔记

2020-11-15 通过初始化指定变量类型 数字-1 对象null和null的比较&#xff08;不理解&#xff09;使用局部变量将属性查找替换为值查找&#xff08;算法复杂度&#xff09;循环的减值迭代&#xff0c;降低了计算终止条件的复杂度switch快多个变量声明逗号隔开使用数组和对象字面…

windows任务计划程序 坑

转载于:https://www.cnblogs.com/kaibindirver/p/8109041.html

javascript --- 类、class、事件委托的编程风格

类风格: // 父类 function Widget(width, height) {this.width width || 50;this.height height || 50;this.$elem null; } Widget.prototype.render function($where) {if(this.$elem) {this.$elem.css({width: this.width "px",height: this.height "p…

堆和堆排序

堆和优先队列 普通队列&#xff1a;FIFO&#xff0c;LILO 优先队列&#xff1a;出队顺序和入队顺序无关&#xff0c;和优先级相关。一个典型应用就是操作系统中。动态选择优先级高的任务执行 堆的实现 最典型的堆就是二叉堆&#xff0c;就像是一颗二叉树。这个堆的特点&#xf…

ES5-1 发展史、ECMA、编程语言、变量、JS值

1. 5大主流浏览器及内核&#xff08;自主研发&#xff09; 浏览器内核IEtridentChromewebkit blinkSafariwebkitFirefoxgeckoOperapresto 2. 浏览器的历史 和 JS诞生 1989-1991 WorldWideWeb&#xff08;后来为了避免与万维网混淆而改名为Nexus&#xff09;是世界上第一个网页…

[Usaco2010 Nov]Visiting Cows

题目描述 经过了几周的辛苦工作,贝茜终于迎来了一个假期.作为奶牛群中最会社交的牛,她希望去拜访N(1<N<50000)个朋友.这些朋友被标号为1..N.这些奶牛有一个不同寻常的交通系统,里面有N-1条路,每条路连接了一对编号为C1和C2的奶牛(1 < C1 < N; 1 < C2 < N; C1…

ES5-2 语法、规范、错误、运算符、判断分支、注释

1. 错误 MDN错误列表 Uncaught SyntaxError: Unexpected token ) // 语法错误 Uncaught ReferenceError: a is not defined // 引用错误等类型 Uncaught TypeError: Cannot read property toString of null出现一个语法错误&#xff0c;则一行代码都不会执行&#xff08;检查…

unity深度查找某个子物体和遍历所有子物体方法

本文总结一下关于unity的查找子物体的方法 首先说明一下这里将讲三种查找子物体方法&#xff1a; 查找固定路径的某一个子物体的方法、通过名字深度查找某个子物体的方法、查找父物体下所有子物体的方法。 第一:查找固定路径的某一个子物体的方法 对于已知的路径可以直接用go.t…

javascript --- JSON字符串化

工具函数JSON.stringify()将JSON对象序列化为字符串时也用到了ToString. 看下面的代码: console.log(JSON.stringify(42)); console.log(JSON.stringify("42")); console.log(JSON.stringify(null)); console.log(JSON.stringify(true));所有安全的JSON值都可以使用…

ES5-3 循环、引用值初始、显示及隐式类型转换

1. 循环 for循环的三个参数abc&#xff0c;a只执行一次&#xff0c;c在每次循环后执行 // 打印0-100的质数 1不是质数 var list [2] for (var i 3; i < 100; i i 2) {var flag falsefor (var j 0; j < list.length; j) {var cur list[j]if (i % cur 0 &…

13 代码分割之import静动态导入

前端首屏优化方案之一 项目构建时会整体打包成一个bundle的JS文件&#xff0c;而有的代码、模块是加载时不需要的&#xff0c;需要分割出来单独形成一个文件块chunk&#xff08;不会打包在main里&#xff09;&#xff0c;让模块懒加载&#xff08;想加载时才加载&#xff09;&a…

2018.01.01(数字三角形,最长上升子序列等)

2017.12.24 简单的动态规划 1.数字三角形(算法引入) 题目描述&#xff1a;下图所示是一个数字三角形&#xff0c;其中三角形中的数值为正整数&#xff0c;现规定从最顶层往下走到最底层&#xff0c;每一步可沿左斜线向下或右斜线向下走。设三角形有n层&#xff0c;编程计算出从…

Mac iOS 允许从任何来源下载应用并打开

一个快捷的小知识点&#xff0c;mark&#xff01; 允许从任何来源下载应用并打开&#xff0c;不用手动去允许&#xff0c;更加简洁&#xff01; 只需一行命令 sudo spctl --master-disable 1.正常情况下&#xff0c;打开偏好设置&#xff0c;选择安全性与隐私&#xff0c;界面是…