前端小白,整理一下自己最近面试遇到的一些问题,解答是我自己的理解和后面查询到的,实时更新一下,方便以后复盘整理
如何解决回调地狱?
使用promise、async/await
闭包、闭包的优缺点
闭包就是能够读取其他函数内部变量的函数:优点,能够读取其他函数内部的变量、保持变量一直存在于内存中,封装对象的私有属性和私有方法。缺点:占用更多的内存,可能会造成性能问题
setTimeOut与setInterVal的区别
setTimeOut是延迟多少秒以后执行;setInterVal是每隔一定的秒数以后执行一次
判断数据类型
typeOf、instanceof、Object.prototype.toString
前端性能优化
减少HTTP请求、使用CDN内容分发网络、添加本地缓存、压缩资源文件、减少DNS查询
JS的语言特性
运行在客户端浏览器上;
不用预编译,直接解析执行代码;
是弱类型语言,较为灵活;
与操作系统无关,跨平台的语言;
脚本语言、解释性语言
用户输入Url访问网站的过程
(缓存,DNS查询,建立链接,请求,响应,收到页面,解析DOM树,显示内容,首屏加载完成,可交互)
事件委托以及冒泡原理
事件委托就是指把一组元素的事件委托在他们的父元素上,运用冒泡阶段的运行机制来实现的
优点是:节约效率 减少内存消耗
深拷贝
var arr = ['old', 1, true, ['old1', 'old2'], {old: 1}]
var new_arr = JSON.parse( JSON.stringify(arr) );
console.log(new_arr);
通过stringify将js类型的数据转换为Json字符串,再通过parse转换为js类型数据 实现深拷贝//对函数无效,仅对对象和数组有效
let const var的区别
var 全局作用域、函数作用域 var存在变量提升
const、let块级作用域 不存在变量提升 const不允许重新赋值 let允许
html5新特性
语义化标签、视频、音频标签、canvas标签、表单增强、地理定位等
ES6新特性
const let变量、箭头函数、一些原有的内置类增强等、引入新的数据类型symbol、引入了promise
数组去重的方法
indexOf、set等
怎样获得对象上的属性
object.key()返回一个对象,包含所有的方法
for(leti in obj)等方法
js对象类型,基本对象类型以及引用对象类型的区别
分为基本对象类型和引用对象类型
基本数据类型:按值访问,可操作保存在变量中的实际的值。基本类型值指的是简单的数据段。基本数据类型有这六种:undefined、null、string、number、boolean、symbol。
引用类型:当复制保存着对象的某个变量时,操作的是对象的引用,但在为对象添加属性时,操作的是实际的对象。引用类型值指那些可能为多个值构成的对象。
引用类型有这几种:Object、Array、RegExp、Date、Function、特殊的基本包装类型(String、Number、Boolean)以及单体内置对象(Global、Math)。
javascript的轮播实现原理
将图片排成一行,然后只准备一张图片大小的容器,然后设置超出部分隐藏,可以设置定时器来控制左右移动
如何实现跨域
JSONP:通过动态创建script,再请求一个带参网址实现跨域通信。document.domain + iframe跨域:两个页面都通过js强制设置document.domain为基础主域,就实现了同域。
location.hash + iframe跨域:a欲与b跨域相互通信,通过中间页c来实现。 三个页面,不同域之间利用iframe的location.hash传值,相同域之间直接js访问来通信。
window.name + iframe跨域:通过iframe的src属性由外域转向本地域,跨域数据即由iframe的window.name从外域传递到本地域。
postMessage跨域:可以跨域操作的window属性之一。
CORS:服务端设置Access-Control-Allow-Origin即可,前端无须设置,若要带cookie请求,前后端都需要设置。
代理跨域:起一个代理服务器,实现数据的转发
vue数据双向绑定
vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的。利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get)和设置属性值(set)。
webpack的作用以及核心配置
webpack配置中需要理解几个核心的概念Entry 、Output、Loaders 、Plugins、 Chunk
Entry:指定webpack开始构建的入口模块,从该模块开始构建并计算出直接或间接依赖的模块或者库
Output:告诉webpack如何命名输出的文件以及输出的目录
Loaders:由于webpack只能处理javascript,所以我们需要对一些非js文件处理成webpack能够处理的模块,比如sass文件
Plugins:Loaders将各类型的文件处理成webpack能够处理的模块,plugins有着很强的能力。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。但也是最复杂的一个。比如对js文件进行压缩优化的UglifyJsPlugin插件
Chunk:coding split的产物,我们可以对一些代码打包成一个单独的chunk,比如某些公共模块,去重,更好的利用缓存。或者按需加载某些功能模块,优化加载时间。在webpack3及以前我们都利用CommonsChunkPlugin将一些公共代码分割成一个chunk,实现单独加载。在webpack4 中CommonsChunkPlugin被废弃,使用SplitChunksPlugin
引用数据类型有什么不同
变量储存的是内存地址,访问的也是访问的内存地址
堆和栈有什么不同
堆,类似于队列,先进先出 变量接受的是引用数据类型,存储的是他的地址,值存放在堆里面
栈,先进后出 接受的是基本数据类型,存储的是它的值,存放在栈里面
事件循环机制
step1:主线程读取JS代码,此时为同步环境,形成相应的堆和执行栈;
step2: 主线程遇到异步任务,指给对应的异步进程进行处理(WEB API);
step3: 异步进程处理完毕(Ajax返回、DOM事件处罚、Timer到等),将相应的异步任务推入任务队列;
step4: 主线程执行完毕,查询任务队列,如果存在任务,则取出一个任务推入主线程处理(先进先出);
step5: 重复执行step2、3、4;称为事件循环。
简述vue生命周期
vue实例从开始创建、初始化数据,编译模板、挂载DOM 渲染、更新、卸载等一系列过程,称为Vue的生命周期,可以分为创建前后、载入前后、更新前后、销毁前后。
**创建前后:** **BeforeCreate** 、 **Created**
**载入前后:** **BeforeMount 、Mounted**
**更新前后:** **BeforeUpdate** 、 **Update**
**销毁前后:** **BeforeDestory** 、 **Destroyed**
最近用js做过什么功能
vue组件化开发有什么好处
vue两大特点:响应式编程、组件化。
vue的优势:轻量级框架、简单易学、双向数据绑定、组件化、数据和结构的分离、虚拟DOM、运行速度快。
vue是单页面应用,使页面局部刷新,不用每次跳转页面都要请求所有数据和dom,这样大大加快了访问速度和提升用户体验。而且他的第三方ui库很多节省开发时间。
你对webpack有什么理解
简述position
relative:相对定位
absolute:相对于最近的有定位的父元素进行绝对定位
static:默认值 无定位
fixed:相对浏览器窗口进行绝对定位
居中的几种方法
flex、margin、position
用过哪些es6的方法
块作用域与全局作用域
行内元素与块元素 怎么将块元素变成行内元素
1)、行内元素
①:设置宽高无效
②:对margin设置左右方向有效,而上下无效,padding设置都无效
③:不会自动换行
2)、块级元素
①:可以设置宽高
②:设置margin和padding都有效
③:可以自动换行
④:多个块状,默认排列从上到下
chrome debug里有哪些插件、功能
前端发展规划
对rem有什么理解
rem是相对于html的根元素的大小的一种字体大小