【JS】太棒了!2018-前端经典面试题整理合集,还附带大厂面试题分享!
1,盒模型
1.1,ie 盒模型算上 border、padding 及自身(不算 margin),标准的只算上自身窗体的大小 css 设置方法如下:
/* 标准模型 */box-sizing:content-box ;/*IE 模型*/box-sizing:border-box ;
1.2,几种获得宽高的方式
dom.style.width/height:这种方式只能取到 dom 元素内联样式所设置的宽高,也就是说如果该节点的样式是在 style 标签中或外联的 CSS 文件中设置的话,通过这种方法是获取不到 dom 的宽高的。
dom.currentStyle.width/height:这种方式获取的是在页面渲染完成后的结果,就是说不管是哪种方式设置的样式,都能获取到。但这种方式只有 IE 浏览器支持。
window.getComputedStyle(dom).width/height:这种方的原理和 2 是一样的,这个可以兼容更多的浏览器,通用性好一些。
dom.getBoundingClientRect().width/height:这种方式是根据元素在视窗中的绝对位置来获取宽高的。
dom.offsetWidth/offsetHeight:这个就没什么好说的了,最常用的,也是兼容最好的。
1.3,拓展 各种获得宽高的方式
- 获取屏幕的高度和宽度(屏幕分辨率):
window.screen.height/width - 获 取 屏 幕 工 作 区 域 的 高 度 和 宽 度 ( 去 掉 状 态 栏 ) :
window.screen.availHeight/availWidth - 网页全文的高度和宽度:
document.body.scrollHeight/Width - 滚动条卷上去的高度和向右卷的宽度:
document.body.scrollTop/scrollLeft - 网页可见区域的高度和宽度(不加边线):
document.body.clientHeight/clientWidth - 网页可见区域的高度和宽度(加边线):
document.body.offsetHeight/offsetWidth
1.4,距重叠解决方案(BFC) BFC 原理
- 内部的 box 会在垂直方向,一个接一个的放置 每个元素的 margin box 的左边,与包含块 border box 的左边相接触(对于从做往右的格式化,否则相反)
- box 垂直方向的距离由 margin 决定,属于同一个 bfc 的两个相邻 box 的 margin 会发生重叠
- bfc 的区域不会与浮动区域的 box 重叠
- bfc 是一个页面上的独立的容器,外面的元素不会影响 bfc 里的元素,反过来,里面的也不会影响外面的
- 计算 bfc 高度的时候,浮动元素也会参与计算 创建 bfc ? float 属性不为 none(脱离文档流)
- position 为 absolute 或 fixed
- display 为 inline-block,table-cell,table-caption,flex,inine-flex ? overflow 不为 visible
- 根元素 demo
2,居中方法
水平方向上
针对 inline, 内联块 inline-block, 内联表 inline-table, inline-flex 元素及img,span,button 等元素
.text_div{text-align:center;
}
不定宽块状元素居中
.text_div{
margin:0 auto;//且需要设置父级宽度
}
通过给父元素设置 float,然后给父元素设置 position:relative 和 left:50%,子元素设置 position:relative 和 left: -50% 来实现水平居中。
.wrap{float:left;
position:relative;
left:50%;
clear:both;
}
.wrap-center{
left:-50%;
}
垂直居中
- 单行内联(inline-)元素垂直居中
通过设置内联元素的高度(height)和行高(line-height)相等,从而使元素垂直居中。
.text_div{height: 120px;
line-height: 120px;
}
- 利用表布局
.father {display: table;
}
.children {
display: table-cell;
vertical-align: middle;
text-align: center;
}
- flex 布局
.center-flex {display: flex;
flex-direction: column;//上下排列
justify-content: center;
}
- 绝对布局方式
已知高度
.parent {position: relative;
}.child {position: absolute;
top: 50%;
height: 100px;
margin-top: -50px;
}
未知高度
.parent {position: relative;
}.child {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
垂直水平居中根据上方结合
flex 方式.parent {
display: flex;
justify-content: center;
align-items: center;
}
grid 方式
.parent {
height: 140px;
display: grid;
}
.child {
margin: auto;
}
3,css 优先级确定
- 每个选择器都有权值,权值越大越优先
- 继承的样式优先级低于自身指定样式
- !important 优先级最高 js 也无法修改
- 权值相同时,靠近元素的样式优先级高 顺序为内联样式表(标签内部)> 内部样式表(当前文件中)> 外部样式表(外部文件中)
4,如何清除浮动
不清楚浮动会发生高度塌陷:浮动元素父元素高度自适应(父元素不写高度时,子元素写了浮动后,父元素会发生高度塌陷)
- clear 清除浮动(添加空 div 法)在浮动元素下方添加空 div,并给该元素写 css 样式:{clear:both;height:0;overflow:hidden;}
- 给浮动元素父级设置高度
- 父级同时浮动(需要给父级同级元素添加浮动)? 父级设置成 inline-block,其 margin: 0 auto 居中方式失效
- 给父级添加 overflow:hidden 清除浮动方法
- 万能清除法 after 伪类 清浮动(现在主流方法,推荐使用)
.float_div:after{content:".";
clear:both;
display:block;
height:0;
overflow:hidden;
visibility:hidden;
}
.float_div{
zoom:1
}
5,link @import 导入 css
(1)link 是 XHTML 标签,除了加载 CSS 外,还可以定义 RSS 等其他事务;@import 属于CSS 范畴,只能加载 CSS。
(2)link 引用 CSS 时,在页面载入时同时加载;@import 需要页面网页完全载入以后加载。
(3)link 无兼容问题;@import 是在 CSS2.1 提出的,低版本的浏览器不支持。
(4)link 支持使用 Javascript 控制 DOM 去改变样式;而@import 不支持。
6, ["1", "2", "3"].map(parseInt)
首先, map 接受两个参数, 一个回调函数 callback, 一个回调函数的 this 值,其中回调函数接受三个参数 currentValue, index, arrary;而题目中, map 只传入了回调函数--parseInt.。其次, parseInt 只接受两个两个参数 string, radix(基数).
本题理解来说也就是 key 与 index
所以本题即问 parseInt('1', 0);parseInt('2', 1);parseInt('3', 2);
parseInt(string, radix)
string 必需,要被解析的字符串。
radix 可选,表示要解析的数字的基数。该值介于 2 ~ 36 之间。
如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。
7,浅拷贝和深拷贝
- 浅拷贝
// 第一层为深拷贝Object.assign()
Array.prototype.slice()
扩展运算符 ...
- 深拷贝
JSON.parse(JSON.stringify())
递归函数
function cloneObject(obj) {var newObj = {} //如果不是引用类型,直接返回
if (typeof obj !== 'object') {
return obj
}
//如果是引用类型,遍历属性
else {
for (var attr in obj) {
//如果某个属性还是引用类型,递归调用
newObj[attr] = cloneObject(obj[attr])
}
}
return newObj
}
8,数组去重的方法
1)ES6 的 Set
let arr = [1,1,2,3,4,5,5,6]let arr2 = [...new Set(arr)]
2)reduce()
let arr = [1,1,2,3,4,5,5,6]let arr2 = arr.reduce(function(ar,cur) {
if(!ar.includes(cur)) {
ar.push(cur)
}
return ar
},[])
3)filter()
// 这种方法会有一个问题:[1,'1']会被当做相同元素,最终输入[1]let arr = [1,1,2,3,4,5,5,6]
let arr2 = arr.filter(function(item,index) {
// indexOf() 方法可返回某个指定的 字符串值 在字符串中首次出现的位置
return arr.indexOf(item) === index
})
9,cookie、localStorage、sessionStorage的区别和使用?
cookie:是存储在本地的数据,有时候也用cookies,通常经过加密,应用最经典的就是判断注册用户是否已经登录过该网站。
localStorage:仅在客户端保存(即浏览器),不参与和服务器的通信;没有时间限制,即使浏览器关闭,数据依然存在;
创建和访问localStorage:1)、设置数据:
var forgetData = {
phone:vm.phone
};
localStorage.setItem("forgetData",JSON.Stringfy(forgetData));
//forgetData是存储在localStorage里边的本地数据;JSON.Stringfy(forgetData)是将数据转化
为字符串格式;
获取数据:
vm.forgetData=JSON.parse(localStorage.getItem("forgetData")); //将字符串
转化为JSON化;
2)、设置:localStorage.name = "zhao";
获取:localStorage.name //zhao
localStorage.setItem(key,value);//设置数据
localStorage.getItem(key);//获取数据
localStorage.removeItem(key);//删除单个数据
localStorage.clear();//清除所有localStorage的数据
sessionStorage:当用户的浏览器窗口关闭时,数据会被清除;
共同点:都是保存在浏览器端,且同源的。
区别:
cookie数据始终在同源的http请求中携带9即使不需要),即cookie在浏览器和服务器之间来回传递;cookie数据还有路径的概念,可以限制cookie只属于某个路径下。存储大小限制也不同,cookie数据大小不能超过4K,同时因为每次http请求都会携带cookie,所以cookie只能保存很小的数据。
sessionStorage和localStorage不会自动把数据发给服务器,只在本地保存,虽然也有大小限制,但是要比cookie大得多,可以达到5M或者更大。
数据有效期不同,
sessionStorage仅在当前浏览器窗口关闭前有效,不能持久保存;
localStorage:始终有效,浏览器窗口关闭也一直保存;
cookie:只在cookie设置的过期时间之前保存,即使浏览器窗口关闭。
作用域不同,
sessionStorage在不同浏览器窗口的数据不能共享,即使是同一个页面;
localStorage在所有的同源窗口中都是共享的;
cookie也是在同源窗口中共享的
10、ajax请求时get和post的区别?
get:从服务器上获取数据,传送数据量小,安全性低,请求会被缓存,缓存是针对URL进行缓存的,get请求参数直接加在URL地址后面,一种参数组合就会产生一种URL的缓存,重复的请求结果是相同的;
post:向服务器发送数据;传送数据量大,请求不会被缓存,参数封装在二进制的数据体中,服务器也不会记录参数,相对安全,所以涉及用户隐私的数据都要用post传送
11、常见状态码
2开头 (请求成功)表示成功处理了请求的状态代码
3开头 (请求被重定向)表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向
4开头 (请求错误)这些状态代码表示请求可能出错,妨碍了服务器的处理
5开头(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错
12,移动端触摸事件
①touchstart:当手指触碰到屏幕的时候触发
②touchmove:当手指在屏幕上滑动的时候触发
③touchend:当手指离开屏幕的时候时候触发
④touchcancel 事件:当系统停止跟踪触摸的时候触发(这个事件很少会用,一般不做深入研究)。电话接入或者弹出信息等其他事件切入 event:
(1)touches:表示当前跟踪的触摸操作的 touch 对象的数组。
(2) targetTouches:特定于事件目标的 Touch 对象的数组。
(3) changeTouches:表示自上次触摸以来发生了什么改变的 Touch 对象的数组。 每个 touch 对象包含的属性
(4) clientX:触摸目标在视口中的 x 坐标。
(5) clientY:触摸目标在视口中的 y 坐标。
(6)identifier:标识触摸的唯一 ID。
(7) pageX:触摸目标在页面中的 x 坐标。
(8) pageY:触摸目标在页面中的 y 坐标。
(9)screenX:触摸目标在屏幕中的 x 坐标。
(10) screenY:触摸目标在屏幕中的 y 坐标。
(11) target:触目的 DOM 节点目标。
13,生命周期
总共分为8个阶段创建前/后,载入前/后,更新前/后,销毁前/后。
(1)什么是vue生命周期
Vue 实例从创建到销毁的过程,就是生命周期。也就是从开始创建、初始化数据、编译模板、挂载
Dom→渲染、更新→渲染、卸载等一系列过程,我们称这是 Vue 的生命周期。
(2)vue生命周期的作用是什么
它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻辑。
(3)vue生命周期总共有几个阶段
可以总共分为8个阶段:创建前/后, 载入前/后,更新前/后,销毁前/销毁后
(4)第一次页面加载会触发哪几个钩子
第一次页面加载时会触发 beforeCreate, created, beforeMount, mounted 这几个钩子
(5)DOM 渲染在 哪个周期中就已经完成
DOM 渲染在 mounted 中就已经完成了
(6)简单描述每个周期具体适合哪些场景
生命周期钩子的一些使用方法:
- beforecreate : 可以在这加个loading事件,在加载实例时触发
- created : 初始化完成时的事件写在这里,如在这结束loading事件,异步请求也适宜在这里调用
- mounted : 挂载元素,获取到DOM节点
- updated : 如果对数据统一处理,在这里写上相应函数
- beforeDestroy : 可以做一个确认停止事件的确认框
- nextTick : 更新数据后立即操作dom
14,Vue 的 nextTick 的原理是什么?
1)为什么需要 nextTick
Vue 是异步修改 DOM 的并且不鼓励开发者直接接触 DOM,但有时候业务需要必须对数据更改--刷新后的 DOM 做相应的处理,这时候就可以使用 Vue.nextTick(callback)这个 api 了。
2)理解原理前的准备
首先需要知道事件循环中宏任务和微任务这两个概念(这其实也是面试常考点)。
常见的宏任务有 script, setTimeout, setInterval, setImmediate, I/O, UI rendering
常见的微任务有 process.nextTick(Nodejs),Promise.then(),MutationObserver;
3)理解 nextTick
而 nextTick 的原理正是 vue 通过异步队列控制 DOM 更新和 nextTick 回调函数先后执行的方式。如果大家看过这部分的源码,会发现其中做了很多 isNative()的判断,因为这里还存在兼容性优雅降级的问题。可见 Vue 开发团队的深思熟虑,对性能的良苦用心。
15,Vue中引入组件的步骤?
1)采用ES6的import ... from ...语法或CommonJS的require()方法引入组件
2)对组件进行注册,代码如下
// 注册Vue.component('my-component', {
template: '<div>A custom component!</div>'
})
3)使用组件 <my-component></my-component>
16,说出至少4种vue当中的指令和它的用法?
- v-if:判断是否隐藏;
- v-for:数据循环;
- v-bind:class:绑定一个属性;
- v-model:实现双向绑定
17,vuex
(1)vuex是什么?怎么使用?哪种功能场景使用它?
vue框架中状态管理。在main.js引入store,注入。新建一个目录store,….. export 。
场景有:单页应用中,组件之间的状态。音乐播放、登录状态、加入购物车
(2)vuex有哪几种属性?
有五种,分别是 State、 Getter、Mutation 、Action、 Module
- vuex的State特性
A、Vuex就是一个仓库,仓库里面放了很多对象。其中state就是数据源存放地,对应于一般Vue对象里面的data
B、state里面存放的数据是响应式的,Vue组件从store中读取数据,若是store中的数据发生改变,依赖这个数据的组件也会发生更新
C、它通过mapState把全局的 state 和 getters 映射到当前组件的 computed 计算属性中 - vuex的Getter特性
A、getters 可以对State进行计算操作,它就是Store的计算属性
B、 虽然在组件内也可以做计算属性,但是getters 可以在多组件之间复用
C、 如果一个状态只在一个组件内使用,是可以不用getters - vuex的Mutation特性
Action 类似于 mutation,不同在于:Action 提交的是 mutation,而不是直接变更状态;Action可以包含任意异步操作。
(3)不用Vuex会带来什么问题?
- 可维护性会下降,想修改数据要维护三个地方;
- 可读性会下降,因为一个组件里的数据,根本就看不出来是从哪来的;
- 增加耦合,大量的上传派发,会让耦合性大大增加,本来Vue用Component就是为了减少耦合,现在这么用,和组件化的初衷相背
18,vuex 是基于redux
1)全局的store
2)响应式
3)不能直接修改,commit(mutation)
vuex使用单一状态树 吧store的实例注入到所有的子组件,mutation处理同步事务
1)action : 提交mutation,异步
2)module
19,vue更新data
1)异步更新
2)多次更新data,只在最后一次渲染
20,react的setState
1)两个参数。 setState(updater,[callback]) ,第一个参数是更新的对象,第二个参数是更新完成的回调函数;
2)setStat本身执行过程和代码是同步的
3)合成事件(onClick、onChanged等)和钩子函数中setState是异步的,将多次合并成一次更新;
4)在原生事件和 setTimeout 中都是同步的。
5)浅合并 Objecr.assign()
21,react的setState流程
1)将state放入数组(队列);
2)检查是否在更新阶段
3)是:组件放在dirtyComponent
4)否:调用update更新,标记当前处于更新阶段
5)最后再遍历dirtyComponent执行更新
22,react和vue的比较
相同
1)vitual dom
2)组件化
3)props,单一数据流
不同点
1)react是jsx和模板;(jsx可以进行更多的js逻辑和操作)
2)状态管理(react)
3)对象属性(vue)
4)vue:view——medol之间双向绑定
5)vue:组件之间的通信(props,callback,emit)
阿里
- 使用过的koa2中间件
- koa-body原理
- 介绍自己写过的中间件
- 有没有涉及到Cluster
- 介绍pm2
- master挂了的话pm2怎么处理
- 如何和MySQL进行通信
- React声明周期及自己的理解
- 如何配置React-Router
- 路由的动态加载模块
- 服务端渲染SSR
- 介绍路由的history
- 介绍Redux数据流的流程
- Redux如何实现多个组件之间的通信,多个组件使用相同状态如何进行管理
- 多个组件之间如何拆分各自的state,每块小的组件有自己的状态,它们之间还有一些公共的状态需要维护,如何思考这块
- 使用过的Redux中间件
- 如何解决跨域的问题
- 常见Http请求头
- 移动端适配1px的问题
- 介绍flex布局
- 其他css方式设置垂直居中
- 居中为什么要使用transform(为什么不使用marginLeft/Top)
- 使用过webpack里面哪些plugin和loader
- webpack里面的插件是怎么实现的
- dev-server是怎么跑起来
- 项目优化
- 抽取公共文件是怎么配置的
- 项目中如何处理安全问题
- 怎么实现this对象的深拷贝
网易
- 介绍redux,主要解决什么问题
- 文件上传如何做断点续传
- 表单可以跨域吗
- promise、async有什么区别
- 搜索请求如何处理(防抖)
- 搜索请求中文如何请求
- 介绍观察者模式
- 介绍中介者模式
- 观察者和订阅-发布的区别,各自用在哪里
- 介绍react优化
- 介绍http2.0
- 通过什么做到并发请求
- http1.1时如何复用tcp连接
- 介绍service worker
- 介绍css3中position:sticky
- redux请求中间件如何处理并发
- 介绍Promise,异常捕获
- 介绍position属性包括CSS3新增
- 浏览器事件流向
- 介绍事件代理以及优缺点
- React组件中怎么做事件代理
- React组件事件代理的原理
- 介绍this各种情况
- 前端怎么控制管理路由
- 使用路由时出现问题如何解决
- React怎么做数据的检查和变化
滴滴
- react-router怎么实现路由切换
- react-router里的
<Link>
标签和<a>
标签有什么区别 - 标签默认事件禁掉之后做了什么才实现了跳转
- React层面的性能优化
- 整个前端性能提升大致分几类
import { Button } from 'antd'
,打包的时候只打包button
,分模块加载,是怎么做到的- 使用
import
时,webpack
对node_modules
里的依赖会做什么 - JS异步解决方案的发展历程以及优缺点
- Http报文的请求会有几个部分
cookie
放哪里,cookie
能做的事情和存在的价值cookie
和token
都存放在header
里面,为什么只劫持前者cookie
和session
有哪些方面的区别React
中Dom
结构发生变化后内部经历了哪些变化React
挂载的时候有3个组件,textComponent、composeComponent、domComponent,区别和关系,Dom结构发生变化时怎么区分data的变化,怎么更新,更新怎么调度,如果更新的时候还有其他任务存在怎么处理- key主要是解决哪一类的问题,为什么不建议用索引index(重绘)
- Redux中异步的请求怎么处理
- Redux中间件是什么东西,接受几个参数(两端的柯里化函数)
- 柯里化函数两端的参数具体是什么东西
- 中间件是怎么拿到store和action,然后怎么处理
- state是怎么注入到组件的,从reducer到组件经历了什么样的过程
- koa中response.send、response.rounded、response.json发生了什么事,浏览器为什么能识别到它是一个json结构或是html
- koa-bodyparser怎么来解析request
- webpack整个生命周期,loader和plugin有什么区别
- 介绍AST(Abstract Syntax Tree)抽象语法树
- 安卓Activity之间数据是怎么传递的
- 安卓4.0到6.0过程中WebView对js兼容性的变化
- WebView和原生是如何通信
- 跨域怎么解决,有没有使用过Apache等方案
以上是 【JS】太棒了!2018-前端经典面试题整理合集,还附带大厂面试题分享! 的全部内容, 来源链接: utcz.com/a/97447.html