最近好多小伙伴都跳槽去找工作,我只能在心里默默的支持他们能找到一份好的工作,这份前端面试大全送给我的小伙伴们,主要说的是前端一些常用的一些知识,说的不对的地方请小伙伴们即使指正出来,自己同时也回顾下这些知识。主要分以下几个方边来说:
声明在HTML文档第一行,告诉浏览器用什么文档标准解析这个文档。DOCTYPE不存在或格式不正确会导致文档以兼容模式呈现。
标准模式的排版 和JS运作模式都是以该浏览器支持的最高标准运行。在兼容模式中,页面以宽松的向后兼容的方式显示,模拟老式浏览器的行为以防止站点无法工作。
每个元素都有一个diaplay属性,确定该元素的类型,比如块级元素默认值就是block,行内元素就是none
行内元素:span a u i b img input slect。。。
块级元素:div p ul li ol h1 h2。。。
link属于html直接是在html中引入,import在css中引入只能引入css
link在直接引入页面的时候就就已经引入了,import需要在引入css的时候才引入,性能比较低。
import是CSS2.1 提出的,只在IE5以上才能被识别,而link是html标签,无兼容问题;
html5新增了好多东西比如:
一些语义化标签 nav header footer
绘图用到的canvas
用于媒体的video 和 audio 元素
本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失,sessionStorage 的数据在浏览器关闭后自动删除;
表单控件,calendar、date、time、email、url、search
区分html5和html:
可以按上文说的doctype区分也可以使用标签区分
语义化是html结构更清晰,便于浏览器解析,利于SEO搜素,使代码更好理解,便于维护
使用position定位:好处不用管盒子大小,就是不固定宽高
{
position: absolute;;
top: 50%;
left: 50%;
margin-left: -50%;
margin-top: -50%;
}
也可以使用calc计算出需要定位的值,需要知道宽高
还可以使用transform: translate(-50%, -50%); 不需要知道宽高
固定宽高的话也可以使用定位
{
position: absolute;;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
}
也可以使用flex
{
display: flex;
justify-content: center;
align-items: center;
}
或者使用最新的grid,父元素必须加grid属性
{
align-self: center;
justify-self: center;
}
还有一种使用table居中缺点也是父盒子宽高为100%必须加display:table;
{
display: table-cell;
text-align: center;
vertical-align: middle;
}
清除浮动最好的方法就是使用:after
:after {
clear:both;
content:'';
display:block;
width:0;
height:0;
}
也可以先新建一个空元素来清除浮动
.clear{
clear:both;
height:0;
line-height:0;
font-size:0;
}
还可以给父元素增加overflow属性
.over-flow{ overflow:auto; zoom:1; }//zoom:1;是在处理兼容性问题
分为两种:ie盒模型和w3c盒模型
盒模型:内容(content)、填充(padding)、边界(margin)、 边框(border);
区别:IE的content部分把 border 和 padding计算了进去;
10.position有几个值
{
width: 0;
height: 0;
border-width: 20px;
border-style: solid;
border-color: transparent transparent red transparent;
}
因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异
最简单的初始化方法: * {padding: 0; margin: 0;} (强烈不建议)
:nth-child :after :befor :checked :disable
transform :translate scale skew rotate; transtion ;animation ;shadow ;border-radius
js有五种基本类型:boolean string number null undefined 一种特殊类型:object
新增了Symbol(创建后独一无二且不可变的数据类型 )
不在同一行声明多个变量 不用全局函数 switch必须有default
函数声明 function name(){}
函数表达式 var name = function(){}
new实例化(不常用)
作用域链的作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到 window 对象即被终止,作用域链向下访问变量是不被允许的。
this 指向直接调用者
this 指向 new 出来的对象
在事件中 this 指向这个事件的对象 IE 中的 attachEvent 的 this 指向全局 window
this 指的当前对象
null 表示一个对象被定义了,值为“空值”;
undefined 表示不存在这个值。
null==undefined true
解析字符串,应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行),也可以把 JSON 字符串转换为 JSON 对象
闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部。
特性:
严格模式就是在 js 代码前加 use strict 让 Javascript 在更严格的条件下运行,使 JS 编码更加规范化的模式,消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为。
/* 封装ajax函数
* @param {string}opt.type http连接的方式,包括POST和GET两种方式
* @param {string}opt.url 发送请求的url
* @param {boolean}opt.async 是否为异步请求,true为异步的,false为同步的
* @param {object}opt.data 发送的参数,格式为对象类型
* @param {function}opt.success ajax发送并接收成功调用的回调函数
*/
function ajax(opt) {
opt = opt || {};
opt.method = opt.method.toUpperCase() || 'POST';
opt.url = opt.url || '';
opt.async = opt.async || true;
opt.data = opt.data || null;
opt.success = opt.success || function () {};
var xmlHttp = null;
if (XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
else {
xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
}var params = [];
for (var key in opt.data){
params.push(key + '=' + opt.data[key]);
}
var postData = params.join('&');
if (opt.method.toUpperCase() === 'POST') {
xmlHttp.open(opt.method, opt.url, opt.async);
xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
xmlHttp.send(postData);
}
else if (opt.method.toUpperCase() === 'GET') {
xmlHttp.open(opt.method, opt.url + '?' + postData, opt.async);
xmlHttp.send(null);
}
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
opt.success(xmlHttp.responseText);
}
};
}
同步:浏览器访问服务器请求,用户看得到页面刷新,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操作
异步:浏览器访问服务器请求,用户正常操作,浏览器后端进行请求。等请求完,页面不刷新,新内容也会出现,用户看到新内容
push()pop()unshift()shift()splice()indexOf()sort()concat()jion()slice()reverse() includes()
.call() .apply() .bind()
jquery.extend 为jquery 类添加类方法,可以理解为添加静态方法
jquery.fn.extend: 源码中 jquery.fn = jquery.prototype,所以对 jquery.fn 的扩展,就是为jquery 类添加成员函数 使用:
jquery.extend扩展,需要通过 jquery 类来调用,而 jquery.fn.extend 扩展,所有jquery实例都可以直接调用
作用域 每个方法都是作用域最大的是 window
作用域的方法和属性只能在当前作用域使用
查找作用域 是从当前查找 再去上一级查找
同域名 同端口 同协议
100 Continue 继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息
200 OK 正常返回信息
201 Created 请求成功并且服务器创建了新的资源
202 Accepted 服务器已接受请求,但尚未处理
301 Moved Permanently 请求的网页已永久移动到新位置。
302 Found 临时性重定向。
303 See Other 临时性重定向,且总是使用 GET 请求新的 URI。
304 Not Modified 自从上次请求后,请求的网页未修改过。
400 Bad Request 服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。
401 Unauthorized 请求未授权。
403 Forbidden 禁止访问。
404 Not Found 找不到如何与 URI 相匹配的资源。
500 Internal Server Error 最常见的服务器端错误。
503 Service Unavailable 服务器端暂时无法处理请求(可能是过载或维护)
1、浏览器会开启一个线程来处理这个请求,对 URL 分析判断如果是 http 协议就按照 Web 方式来处理;
2、调用浏览器内核中的对应方法,比如 WebView 中的 loadUrl 方法;
3、通过DNS解析获取网址的IP地址,设置 UA 等信息发出第二个GET请求;
4、进行HTTP协议会话,客户端发送报头(请求报头);
5、进入到web服务器上的 Web Server,如 Apache、Tomcat、Node.JS 等服务器;
6、进入部署好的后端应用,如 PHP、Java、JavaScript、Python 等,找到对应的请求处理;
7、处理结束回馈报头,此处如果浏览器访问过,缓存上有对应资源,会与服务器最后修改时间对比,一致则返回304;
8、浏览器开始下载html文档(响应报头,状态码200),同时使用缓存;
9、文档树建立,根据标记请求所需指定MIME类型的文件(比如css、js),同时设置了cookie;
10、页面开始渲染DOM,JS根据DOM API操作DOM,执行事件绑定等,页面显示完成。
MVVM 是 Model-View-ViewModel 的缩写。
在 MVVM 架构下,View 和 Model 之间并没有直接的联系,而是通过 ViewModel 进行交互,Model 和 ViewModel 之间的交互是双向的, 因此 View 数据的变化会同步到 Model 中,而Model 数据的变化也会立即反应到 View 上。
ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而 View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。
vue 实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应监听回调。当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter。用户看不到 getter/setter,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化。
vue 的数据双向绑定,将 MVVM 作为数据绑定的入口,整合 Observer,Compile和Watcher三者,通过 Observer 来监听自己的 model 的数据变化,通过 Compile 来解析编译模板指令(vue中是用来解析 {{}}),最终利用 watcher 搭起 observer 和 Compile 之间的通信桥梁,达到数据变化 —>视图更新;视图交互变化(input)—>数据 model 变更双向绑定效果。
React 采用特殊的 JSX 语法,Vue.js 在组件开发中也推崇编写 .vue 特殊文件格式,对文件内容都有一些约定,两者都需要编译后使用;中心思想相同:一切都是组件,组件实例之间可以嵌套;都提供合理的钩子函数,可以让开发者定制化地去处理需求;都不内置列数 AJAX,Route 等功能到核心包,而是以插件的方式加载;在组件开发中都支持 mixins 的特性。
React 采用的 Virtual DOM 会对渲染出来的结果做脏检查;Vue.js 在模板中提供了指令,过滤器等,可以非常方便,快捷地操作 Virtual DOM。
首页可以控制导航跳转,beforeEach,afterEach 等,一般用于页面 title 的修改。一些需要登录才能调整页面的重定向功能。
beforeEach 主要有3个参数 to,from,next:
只用来读取的状态集中放在 store 中; 改变状态的方式是提交 mutations,这是个同步的事物; 异步逻辑应该封装在 action 中。
在 main.js 引入 store,注入。新建了一个目录 store,….. export 。
场景有:单页应用中,组件之间的状态、音乐播放、登录状态、加入购物车
Vuex 使用单一状态树,即每个应用将仅仅包含一个 store 实例,但单一状态树和模块化并不冲突。存放的数据状态,不可以直接修改里面的数据。
mutations 定义的方法动态修改Vuex 的 store 中的状态或数据。
类似 vue 的计算属性,主要用来过滤一些数据。
actions 可以理解为通过将mutations里面处里数据的方法变成可异步的处理数据的方法,简单的说就是异步操作数据。view 层通过 store.dispath 来分发 action。
WXML (WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件、事件系统,可以构建出页面的结构。内部主要是微信自己定义的一套组件。
可以看我上篇文章微信小程序组件的封装:https://juejin.im/post/5afcee09518825670961
给 HTML 元素添加 data-*属性来传递我们需要的值,然后通过 e.currentTarget.dataset 或onload的param参数获取。但 data -名称不能有大写字母和不可以存放对象
wxss的图片引入需使用外链地址;
没有 Body;样式可直接使用 import 导入
使用 wx.getUserInfo 方法 withCredentials 为 true 时 可获取 encryptedData,里面有 union_id。后端需要进行对称解密
微信小程序获取用户信息需要用户授权,首先用户登陆微信小程序使用 wx.login 这个 API,然后通过 wx.getUserInfo 这个 API 在拿到用户信息
取值也不一样,小程序中,通过 this.data.reason 取值,vue 中,通过 this.reason 取值
父子组件间的通信也不同
本文章参考资料:https://segmentfault.com/a/1190000016344599
非常感谢上边那位作者。
另外我把项目放到了github上边,希望小哥哥小姐姐们多多点赞,多多支持,有什么疑问可以在github上问我,谢谢大家阅读本文章。
项目地址:https://github.com/Mr-MengBo/Front-end-interview