如下是我整理我面试遇到的一些我以为具备表明性的题目,恰好30题,吐血献上!javascript
0.谈谈对前端安全的理解,有什么,怎么防范css
前端安全问题主要有XSS、CSRF攻击
XSS:跨站脚本攻击
它容许用户将恶意代码植入到提供给其余用户使用的页面中,能够简单的理解为一种javascript代码注入。
XSS的防护措施:html
eval
、new Function
等执行字符串的方法,除非肯定字符串和用户输入无关CSRF:跨站请求伪造
其实就是网站中的一些提交行为,被黑客利用,在你访问黑客的网站的时候进行操做,会被操做到其余网站上
CSRF防护措施:前端
其余的一些攻击方法还有HTTP劫持、界面操做劫持java
1.使用箭头函数须要注意的地方node
当要求动态上下文的时候,你就不能使用箭头函数,好比:定义方法,用构造器建立对象,处理时间时用 this
获取目标。jquery
2.webpack.load的原理webpack
loaders是你用在app源码上的转换元件。他们是用node.js运行的,把源文件做为参数,返回新的资源的函数。git
3.ES6 let、constweb
let
let是更完美的var
window.变量名
的方式访问for (let x…)
的循环在每次迭代时都为x
建立新的绑定const
定义常量值,不能够从新赋值,可是若是值是一个对象,能够改变对象里的属性值
const OBJ = {"a":1, "b":2}; OBJ.a = 3; OBJ = {};// 从新赋值,报错! console.log(OBJ.a); // 3
4.CSS3 box-sizing的做用
设置CSS盒模型为标准模型或IE模型。标准模型的宽度只包括content,二IE模型包括border和padding
box-sizing属性能够为三个值之一:
5.说说HTML5中有趣的标签(新标签及语义化)
若是代码写的语义化,有利于SEO。搜索引擎就会很容易的读懂该网页要表达的意思。例如文本模块要有大标题,合理利用h1-h6,列表形式的代码使用ul或ol,重要的文字使用strong等等。总之就是要充分利用各类HTML标签完成他们本职的工做
6.git命令,如何批量删除分支
git branch |grep 'branchName' |xargs git branch -D
,从分支列表中匹配到指定分支,而后一个一个(分红小块)传递给删除分支的命令,最后进行删除。(参考这里)
7.建立对象的三种方法
第一种方式,字面量
var o1 = {name: "o1"} var o2 = new Object({name: "o2"})
第二种方式,经过构造函数
var M = function(name){ this.name = name } var o3 = new M("o3")
第三种方式,Object.create
var p = {name: "p"} var o4 = Object.create(p)
新建立的对o4的原型就是p,同时o4也拥有了属性name
8.JS实现继承的几种方式
借用构造函数实现继承
function Parent1(){ this.name = "parent1" } function Child1(){ Parent1.call(this); this.type = "child1"; }
缺点:Child1没法继承Parent1的原型对象,并无真正的实现继承(部分继承)
借用原型链实现继承
function Parent2(){ this.name = "parent2"; this.play = [1,2,3]; } function Child2(){ this.type = "child2"; } Child2.prototype = new Parent2();
缺点:原型对象的属性是共享的
组合式继承
function Parent3(){ this.name = "parent3"; this.play = [1,2,3]; } function Child3(){ Parent3.call(this); this.type = "child3"; } Child3.prototype = Object.create(Parent3.prototype); Child3.prototype.constructor = Child3;
9.当new Foo()时发生了什么
1.建立了一个新对象
2.将this指向这个新对象
3.执行构造函数里面的代码
4.返回新对象(this)
参考《JS高程》6.6.2
10.你作过哪些性能优化
雪碧图,移动端响应式图片,静态资源CDN,减小Dom操做(事件代理、fragment),压缩JS和CSS、HTML等,DNS预解析
11.浏览器渲染原理
首先来看一张图:
更多详情看这里
12.前端路由的原理
什么是路由?简单的说,路由是根据不一样的 url 地址展现不一样的内容或页面
使用场景?前端路由更多用在单页应用上, 也就是SPA, 由于单页应用, 基本上都是先后端分离的, 后端天然也就不会给前端提供路由。
前端的路由和后端的路由在实现技术上不同,可是原理都是同样的。在 HTML5 的 history API 出现以前,前端的路由都是经过 hash 来实现的,hash 能兼容低版本的浏览器。
两种实现前端路由的方式
HTML5 History两个新增的API:history.pushState
和 history.replaceState
,两个 API 都会操做浏览器的历史记录,而不会引发页面的刷新。
Hash就是url 中看到 #
,咱们须要一个根据监听哈希变化触发的事件( hashchange
) 事件。咱们用 window.location
处理哈希的改变时不会从新渲染页面,而是看成新页面加到历史记录中,这样咱们跳转页面就能够在 hashchange 事件中注册 ajax 从而改变页面内容。
优势
从性能和用户体验的层面来比较的话,后端路由每次访问一个新页面的时候都要向服务器发送请求,而后服务器再响应请求,这个过程确定会有延迟。而前端路由在访问一个新页面的时候仅仅是变换了一下路径而已,没有了网络延迟,对于用户体验来讲会有至关大的提高。
更多内容请看这里
缺点
使用浏览器的前进,后退键的时候会从新发送请求,没有合理地利用缓存。
13.Restful API是什么
Restful API就是符合Restful架构的API设计。
Restful API一些具体实践:
14.script标签的defer、async的区别
defer是在HTML解析完以后才会执行,若是是多个,按照加载的顺序依次执行
async是在加载完成后当即执行,若是是多个,执行顺序和加载顺序无关
15.同源与跨域
什么是同源策略?
限制从一个源加载的文档或脚本如何与来自另外一个源的资源进行交互。
一个源指的是主机名、协议和端口号的组合,必须相同
跨域通讯的几种方式
JSONP原理
基本原理:利用script
标签的异步加载特性实现
给服务端传一个回调函数,服务器返回一个传递过去的回调函数名称的JS代码
更多请查看:《先后端通讯类知识》
16.原型与闭包相关问题
原型是什么
原型就是一个普通的对象,每一个对象都有一个原型(Object除外),原型能存储咱们的方法,构造函数建立出来的实例对象可以引用原型中的方法。
查看原型
之前通常使用对象的__proto__
属性,ES6推出后,推荐用Object.getPrototypeOf()
方法来获取对象的原型
闭包是什么?
专业说法:当一个内部函数被其外部函数以外的变量引用时,就造成了一个闭包。
还能够这么理解:
闭包就是一个具备封闭功能与包裹功能的结构,是为了实现具备私有访问空间的函数的,函数能够构成闭包,由于函数内部定义的数据函数外部没法访问,即函数具备封闭性;函数能够封装代码即具备包裹性,因此函数能够构成闭包。
建立闭包的最多见的方式就是在一个函数内建立另外一个函数,经过另外一个函数访问这个函数的局部变量
闭包的特性
闭包有三个特性:
闭包有什么用,使用场景
当咱们须要在模块中定义一些变量,并但愿这些变量一直保存在内存中但又不会“污染”全局的变量时,就能够用闭包来定义这个模块。
闭包的缺点
闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易形成内存泄露。
函数套函数就是闭包吗?不是!,当一个内部函数被其外部函数以外的变量引用时,才会造成了一个闭包。
更多内容请看这里
17.如何进行错误监控
前端错误的分类
错误的捕获方式
即时运行错误的捕获方式:
资源加载错误:
延伸:跨域的js运行错误能够捕获吗,错误提示什么,应该怎么处理?
能够。
Script error
1.在script标签增长crossorigin属性
2.设置js资源响应头Access-Control-Allow-Orgin:*
上报错误的基本原理
采用Ajax通讯方式上报
利用Image对象上报
18.DOM事件类
DOM事件的级别
DOM事件模型是什么:指的是冒泡和捕获
DOM事件流是什么:捕获阶段 -> 目标阶段 -> 冒泡阶段
描述DOM事件捕获的具体流程
window --> document --> documentElement(html标签) --> body --> .... --> 目标对象
Event对象常见应用
如何自定义事件
Event,不能传递参数
var eve = new Event('自定义事件名'); ev.addEventListener('自定义事件名', function(){ console.log('自定义事件') }); ev.dispatchEvent(eve);
CustomEvent,还能够指定参数
19.本地起了一个http server,为何只能在同一个WIFI(局域网)上访问?
你没有公网IP固然就不能被外网访问了。常见的WIFI状况下,通常的ip会是~192.168.0.x·这样的,只是对局域网(同WIFI下)可见,可是外网是访问不了的。(segmentfault上的答案)
20.回流和重绘
21.数组去重的方法
22.深拷贝与浅拷贝
是什么
浅拷贝只复制指向某个对象的指针,而不复制对象自己,新旧对象仍是共享同一块内存。但深拷贝会另外创造一个如出一辙的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
实现浅拷贝
var obj1 = { a: 10, b: 20, c: 30 }; var obj2 = obj1; obj2.b = 100; console.log(obj1); // { a: 10, b: 100, c: 30 } <-- b 被改到了 console.log(obj2); // { a: 10, b: 100, c: 30 }
实现深拷贝
var obj1 = { a: 10, b: 20, c: 30 }; var obj2 = { a: obj1.a, b: obj1.b, c: obj1.c }; obj2.b = 100; console.log(obj1); // { a: 10, b: 20, c: 30 } <-- b 沒被改到 console.log(obj2); // { a: 10, b: 100, c: 30 }
深拷贝实现方式
var obj1 = { a: 10, b: 20, c: 30 }; var obj2 = Object.assign({}, obj1); obj2.b = 100; console.log(obj1); // { a: 10, b: 20, c: 30 } <-- 沒被改到 console.log(obj2); // { a: 10, b: 100, c: 30 }
function clone( o ) { var temp = {}; for( var k in o ) { if( typeof o[ k ] == 'object' ){ temp[ k ] = clone( o[ k ] ); } else { temp[ k ] = o[ k ]; } } return temp; }
23.如何快速合并雪碧图
Gulp:gulp-css-spriter
webpack:optimize-css-assets-webpack-plugin
Go!Png
在线工具
24.代码优化基本方法
减小HTTP请求
HTML优化:
CSS优化:
js优化:
图片优化:
减小DOM操做
使用JSON格式来进行数据交换
使用CDN加速
使用HTTP缓存:添加 Expires
或 Cache-Control
信息头
使用DNS预解析
Chrome内置了DNS Prefetching技术, Firefox 3.5 也引入了这一特性,因为Chrome和Firefox 3.5自己对DNS预解析作了相应优化设置,因此设置DNS预解析的不良影响之一就是可能会下降Google Chrome浏览器及火狐Firefox 3.5浏览器的用户体验。
预解析的实现:
<meta http-equiv="x-dns-prefetch-control" content="on" />
<link rel="dns-prefetch" href="http://bdimg.share.baidu.com" />
25.HTTPS的握手过程
26.BFC相关问题
BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有 Block-level box 参 与, 它规定了内部的 Block-level Box 如何布局,而且与这个区域外部绝不相干。
BFC的渲染规则
如何建立BFC?
BFC的使用场景
他的很经常使用的一个应用场景就是解决边距重叠的问题.
27.响应式图片
1.JS或者服务端硬编码,resize事件,判断屏幕大小加载不一样的图片
2.img srcset 方法
3.picture标签 -> source
4.svg
5.第三方库polyfill
28.判断一个变量是不是数组
var a = []; // 1.基于instanceof a instanceof Array; // 2.基于constructor a.constructor === Array; // 3.基于Object.prototype.isPrototypeOf Array.prototype.isPrototypeOf(a); // 4.基于getPrototypeOf Object.getPrototypeOf(a) === Array.prototype; // 5.基于Object.prototype.toString Object.prototype.toString.apply(a) === '[object Array]'; // 6.Array.isArray Array.isArray([]); // true
以上,除了Object.prototype.toString
外,其它方法都不能正确判断变量的类型。
29.UTF-8和Unicode的区别
UTF-8就是在互联网上使用最广的一种unicode的实现方式。
Unicode的出现是为了统一地区性文字编码方案,为解决unicode如何在网络上传输的问题,因而面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。
ASCII --> 地区性编码(GBK) --> Unicode --> UTF-8
转载连接:http://www.imooc.com/article/20319
想知道本身什么水平就出去面试....
金九银十,在九月以前把工做落实了,经历了好几个公司的面试,获得一些信息,和你们分享:
如下是我整理我面试遇到的一些我以为具备表明性的题目,恰好30题,吐血献上!
0.谈谈对前端安全的理解,有什么,怎么防范前端安全问题主要有XSS、CSRF攻击
XSS:跨站脚本攻击
它容许用户将恶意代码植入到提供给其余用户使用的页面中,能够简单的理解为一种javascript代码注入。
XSS的防护措施:
eval
、new Function
等执行字符串的方法,除非肯定字符串和用户输入无关CSRF:跨站请求伪造
其实就是网站中的一些提交行为,被黑客利用,在你访问黑客的网站的时候进行操做,会被操做到其余网站上
CSRF防护措施:
其余的一些攻击方法还有HTTP劫持、界面操做劫持
1.使用箭头函数须要注意的地方当要求动态上下文的时候,你就不能使用箭头函数,好比:定义方法,用构造器建立对象,处理时间时用 this
获取目标。
loaders是你用在app源码上的转换元件。他们是用node.js运行的,把源文件做为参数,返回新的资源的函数。
3.ES6 let、constlet
let是更完美的var
window.变量名
的方式访问for (let x…)
的循环在每次迭代时都为x
建立新的绑定const
定义常量值,不能够从新赋值,可是若是值是一个对象,能够改变对象里的属性值
const OBJ = {"a":1, "b":2}; OBJ.a = 3; OBJ = {};// 从新赋值,报错! console.log(OBJ.a); // 3
4.CSS3 box-sizing的做用
设置CSS盒模型为标准模型或IE模型。标准模型的宽度只包括content,二IE模型包括border和padding
box-sizing属性能够为三个值之一:
若是代码写的语义化,有利于SEO。搜索引擎就会很容易的读懂该网页要表达的意思。例如文本模块要有大标题,合理利用h1-h6,列表形式的代码使用ul或ol,重要的文字使用strong等等。总之就是要充分利用各类HTML标签完成他们本职的工做
6.git命令,如何批量删除分支git branch |grep 'branchName' |xargs git branch -D
,从分支列表中匹配到指定分支,而后一个一个(分红小块)传递给删除分支的命令,最后进行删除。(参考这里)
第一种方式,字面量
var o1 = {name: "o1"} var o2 = new Object({name: "o2"})
第二种方式,经过构造函数
var M = function(name){ this.name = name } var o3 = new M("o3")
第三种方式,Object.create
var p = {name: "p"} var o4 = Object.create(p)
新建立的对o4的原型就是p,同时o4也拥有了属性name
8.JS实现继承的几种方式借用构造函数实现继承
function Parent1(){ this.name = "parent1" } function Child1(){ Parent1.call(this); this.type = "child1"; }
缺点:Child1没法继承Parent1的原型对象,并无真正的实现继承(部分继承)
借用原型链实现继承
function Parent2(){ this.name = "parent2"; this.play = [1,2,3]; } function Child2(){ this.type = "child2"; } Child2.prototype = new Parent2();
缺点:原型对象的属性是共享的
组合式继承
function Parent3(){ this.name = "parent3"; this.play = [1,2,3]; } function Child3(){ Parent3.call(this); this.type = "child3"; } Child3.prototype = Object.create(Parent3.prototype); Child3.prototype.constructor = Child3;
9.当new Foo()时发生了什么
1.建立了一个新对象
2.将this指向这个新对象
3.执行构造函数里面的代码
4.返回新对象(this)
参考《JS高程》6.6.2
雪碧图,移动端响应式图片,静态资源CDN,减小Dom操做(事件代理、fragment),压缩JS和CSS、HTML等,DNS预解析
11.浏览器渲染原理首先来看一张图:
12.前端路由的原理更多详情看这里
什么是路由?简单的说,路由是根据不一样的 url 地址展现不一样的内容或页面
使用场景?前端路由更多用在单页应用上, 也就是SPA, 由于单页应用, 基本上都是先后端分离的, 后端天然也就不会给前端提供路由。
前端的路由和后端的路由在实现技术上不同,可是原理都是同样的。在 HTML5 的 history API 出现以前,前端的路由都是经过 hash 来实现的,hash 能兼容低版本的浏览器。
两种实现前端路由的方式
HTML5 History两个新增的API:history.pushState
和 history.replaceState
,两个 API 都会操做浏览器的历史记录,而不会引发页面的刷新。
Hash就是url 中看到 #
,咱们须要一个根据监听哈希变化触发的事件( hashchange
) 事件。咱们用window.location
处理哈希的改变时不会从新渲染页面,而是看成新页面加到历史记录中,这样咱们跳转页面就能够在 hashchange 事件中注册 ajax 从而改变页面内容。
优势
从性能和用户体验的层面来比较的话,后端路由每次访问一个新页面的时候都要向服务器发送请求,而后服务器再响应请求,这个过程确定会有延迟。而前端路由在访问一个新页面的时候仅仅是变换了一下路径而已,没有了网络延迟,对于用户体验来讲会有至关大的提高。
更多内容请看这里
缺点
使用浏览器的前进,后退键的时候会从新发送请求,没有合理地利用缓存。
Restful API就是符合Restful架构的API设计。
Restful API一些具体实践:
defer是在HTML解析完以后才会执行,若是是多个,按照加载的顺序依次执行
async是在加载完成后当即执行,若是是多个,执行顺序和加载顺序无关
什么是同源策略?
限制从一个源加载的文档或脚本如何与来自另外一个源的资源进行交互。
一个源指的是主机名、协议和端口号的组合,必须相同
跨域通讯的几种方式
JSONP原理
基本原理:利用script
标签的异步加载特性实现
给服务端传一个回调函数,服务器返回一个传递过去的回调函数名称的JS代码
16.原型与闭包相关问题更多请查看:《先后端通讯类知识》
原型是什么
原型就是一个普通的对象,每一个对象都有一个原型(Object除外),原型能存储咱们的方法,构造函数建立出来的实例对象可以引用原型中的方法。
查看原型
之前通常使用对象的__proto__
属性,ES6推出后,推荐用Object.getPrototypeOf()
方法来获取对象的原型
闭包是什么?
专业说法:当一个内部函数被其外部函数以外的变量引用时,就造成了一个闭包。
还能够这么理解:
闭包就是一个具备封闭功能与包裹功能的结构,是为了实现具备私有访问空间的函数的,函数能够构成闭包,由于函数内部定义的数据函数外部没法访问,即函数具备封闭性;函数能够封装代码即具备包裹性,因此函数能够构成闭包。
建立闭包的最多见的方式就是在一个函数内建立另外一个函数,经过另外一个函数访问这个函数的局部变量
闭包的特性
闭包有三个特性:
闭包有什么用,使用场景
当咱们须要在模块中定义一些变量,并但愿这些变量一直保存在内存中但又不会“污染”全局的变量时,就能够用闭包来定义这个模块。
闭包的缺点
闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易形成内存泄露。
函数套函数就是闭包吗?不是!,当一个内部函数被其外部函数以外的变量引用时,才会造成了一个闭包。
17.如何进行错误监控更多内容请看这里
前端错误的分类
错误的捕获方式
即时运行错误的捕获方式:
资源加载错误:
延伸:跨域的js运行错误能够捕获吗,错误提示什么,应该怎么处理?
能够。
Script error
1.在script标签增长crossorigin属性
2.设置js资源响应头Access-Control-Allow-Orgin:*
上报错误的基本原理
采用Ajax通讯方式上报
利用Image对象上报
DOM事件的级别
DOM事件模型是什么:指的是冒泡和捕获
DOM事件流是什么:捕获阶段 -> 目标阶段 -> 冒泡阶段
描述DOM事件捕获的具体流程
window --> document --> documentElement(html标签) --> body --> .... --> 目标对象
Event对象常见应用
如何自定义事件
Event,不能传递参数
var eve = new Event('自定义事件名'); ev.addEventListener('自定义事件名', function(){ console.log('自定义事件') }); ev.dispatchEvent(eve);
CustomEvent,还能够指定参数
19.本地起了一个http server,为何只能在同一个WIFI(局域网)上访问?你没有公网IP固然就不能被外网访问了。常见的WIFI状况下,通常的ip会是~192.168.0.x·这样的,只是对局域网(同WIFI下)可见,可是外网是访问不了的。(segmentfault上的答案)
20.回流和重绘 21.数组去重的方法 22.深拷贝与浅拷贝是什么
浅拷贝只复制指向某个对象的指针,而不复制对象自己,新旧对象仍是共享同一块内存。但深拷贝会另外创造一个如出一辙的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
实现浅拷贝
var obj1 = { a: 10, b: 20, c: 30 }; var obj2 = obj1; obj2.b = 100; console.log(obj1); // { a: 10, b: 100, c: 30 } <-- b 被改到了 console.log(obj2); // { a: 10, b: 100, c: 30 }
实现深拷贝
var obj1 = { a: 10, b: 20, c: 30 }; var obj2 = { a: obj1.a, b: obj1.b, c: obj1.c }; obj2.b = 100; console.log(obj1); // { a: 10, b: 20, c: 30 } <-- b 沒被改到 console.log(obj2); // { a: 10, b: 100, c: 30 }
深拷贝实现方式
var obj1 = { a: 10, b: 20, c: 30 }; var obj2 = Object.assign({}, obj1); obj2.b = 100; console.log(obj1); // { a: 10, b: 20, c: 30 } <-- 沒被改到 console.log(obj2); // { a: 10, b: 100, c: 30 }
function clone( o ) { var temp = {}; for( var k in o ) { if( typeof o[ k ] == 'object' ){ temp[ k ] = clone( o[ k ] ); } else { temp[ k ] = o[ k ]; } } return temp; }
Gulp:gulp-css-spriter
webpack:optimize-css-assets-webpack-plugin
Go!Png
在线工具
减小HTTP请求
HTML优化:
CSS优化:
js优化:
图片优化:
减小DOM操做
使用JSON格式来进行数据交换
使用CDN加速
使用HTTP缓存:添加 Expires
或 Cache-Control
信息头
使用DNS预解析
Chrome内置了DNS Prefetching技术, Firefox 3.5 也引入了这一特性,因为Chrome和Firefox 3.5自己对DNS预解析作了相应优化设置,因此设置DNS预解析的不良影响之一就是可能会下降Google Chrome浏览器及火狐Firefox 3.5浏览器的用户体验。
预解析的实现:
<meta http-equiv="x-dns-prefetch-control" content="on" />
<link rel="dns-prefetch" href="http://bdimg.share.baidu.com" />
BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有 Block-level box 参 与, 它规定了内部的 Block-level Box 如何布局,而且与这个区域外部绝不相干。
BFC的渲染规则
如何建立BFC?
BFC的使用场景
他的很经常使用的一个应用场景就是解决边距重叠的问题.
1.JS或者服务端硬编码,resize事件,判断屏幕大小加载不一样的图片
2.img srcset 方法
3.picture标签 -> source
4.svg
5.第三方库polyfill
var a = []; // 1.基于instanceof a instanceof Array; // 2.基于constructor a.constructor === Array; // 3.基于Object.prototype.isPrototypeOf Array.prototype.isPrototypeOf(a); // 4.基于getPrototypeOf Object.getPrototypeOf(a) === Array.prototype; // 5.基于Object.prototype.toString Object.prototype.toString.apply(a) === '[object Array]'; // 6.Array.isArray Array.isArray([]); // true
以上,除了Object.prototype.toString
外,其它方法都不能正确判断变量的类型。
UTF-8就是在互联网上使用最广的一种unicode的实现方式。Unicode的出现是为了统一地区性文字编码方案,为解决unicode如何在网络上传输的问题,因而面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。ASCII --> 地区性编码(GBK) --> Unicode --> UTF-8