Promise 中不能自定义使用 try/catch 进行错误捕获,可是在 Async/await 中能够像处理同步代码处理错误javascript
一个独立的 worker 线程,独立于当前网页进程,有本身独立的 worker context。css
一旦被 install,就永远存在,除非被 uninstallhtml
须要的时候能够直接唤醒,不须要的时候自动睡眠(有效利用资源,此处有坑)前端
可编程拦截代理请求和返回,缓存文件,缓存的文件能够被网页进程取到(包括网络离线状态)java
能向客户端推送消息node
不能直接操做 DOM,可是service worker能够经过postMessage与页面之间通讯,把消息通知给页面,若是须要的话,让页面本身去操做DOM。react
出于安全的考虑,必须在 HTTPS 环境下才能工做css3
异步实现,内部大都是经过 Promise 实现git
三、列举Es6,经常使用的一些新特性es6
class
定义了一个“类”,能够看到里面有一个constructor
方法,这就是构造方法,而this
关键字则表明实例对象;Class之间能够经过extends
关键字实现继承;super
关键字,它指代父类的实例(即父类的this对象)30分钟掌握ES6/ES2015核心内容(上)// 假设咱们有两个js文件: index.js和content.js,如今咱们想要在index.js中使用content.js返回的结果,咱们要怎么作呢? //content.js define('content.js', function(){ return 'A cat'; }) // AMD //index.js require(['./content.js'], function(animal){ console.log(animal); //A cat }) // CMD //index.js var animal = require('./content.js') //content.js module.exports = 'A cat' // ES6 //index.js import animal from './content' //content.js export default 'A cat'
underfind
参考资料以下:
ECMAScript 6 入门
ES6 Promise 用法讲解
六、类型转换规则
[] == ![]
七、如何实现深拷贝?
Object.assign
是用来深拷贝的,其实并非,Object.assign
只会拷贝全部的属性值到新的对象中,若是属性值是对象的话,拷贝的是地址,因此并非深拷贝。Object.assign()
行为一致, 执行的都是浅拷贝(只遍历一层)undefined
function deepClone(obj) { function isObject(o) { return (typeof o === 'object' || typeof o === 'function') && o !== null } if (!isObject(obj)) { throw new Error('非对象') } let isArray = Array.isArray(obj) // 扩展运算符只拷贝一层 let newObj = isArray ? [...obj] : { ...obj } Reflect.ownKeys(newObj).forEach(key => { newObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key] }) return newObj }
八、如何理解原型、原型链?
Object
是全部对象的爸爸,全部对象均可以经过 __proto__
找到它Function
是全部函数的爸爸,全部函数均可以经过 __proto__
找到它prototype
是一个对象__proto__
属性指向原型, __proto__
将对象和原型链接起来组成了原型链九、基本类型判断,如怎么区分数组和对象?
if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; }; }
// 视能力分别使用dom0||dom2||IE方式 来绑定事件 // 参数: 操做的元素,事件名称 ,事件处理程序 addEvent : function(element, type, handler) { if (element.addEventListener) { //事件类型、须要执行的函数、是否捕捉 element.addEventListener(type, handler, false); } else if (element.attachEvent) { element.attachEvent('on' + type, function() { handler.call(element); }); } else { element['on' + type] = handler; } }, // 移除事件 removeEvent : function(element, type, handler) { if (element.removeEventListener) { element.removeEventListener(type, handler, false); } else if (element.datachEvent) { element.detachEvent('on' + type, handler); } else { element['on' + type] = null; } }, // 阻止事件 (主要是事件冒泡,由于IE不支持事件捕获) stopPropagation : function(ev) { if (ev.stopPropagation) { ev.stopPropagation(); } else { ev.cancelBubble = true; } }, // 取消事件的默认行为 preventDefault : function(event) { if (event.preventDefault) { event.preventDefault(); } else { event.returnValue = false; } }, // 获取事件目标 getTarget : function(event) { return event.target || event.srcElement; }, // 获取event对象的引用,取到事件的全部信息,确保随时能使用event; getEvent : function(e) { var ev = e || window.event; if (!ev) { var c = this.getEvent.caller; while (c) { ev = c.arguments[0]; if (ev && Event == ev.constructor) { break; } c = c.caller; } } return ev; }
/(\d)(?=(/d{3})+\.)/g
num.toString() .replace(/(\d)(?=(\d{3})+\.)/g, function($0, $1) { return $1 + ","; });
absolute 生成绝对定位的元素,相对于值不为 static的第一个父元素进行定位。
fixed (老IE不支持) 生成绝对定位的元素,相对于浏览器窗口进行定位。
relative 生成相对定位的元素,相对于其正常位置进行定位。
static 默认值。没有定位,元素出如今正常的流中(忽略 top, bottom, left, right z-index 声明)。
inherit 规定从父元素继承 position 属性的值。
overflow:visible
觉得的overflow设置,不然没有粘滞效果。由于改变了滚动容器(即便没有出现滚动条)。所以,若是你的position:sticky
无效,看看是否是某一个祖先元素设置了overflow:hidden
,移除之便可。png24位的图片在iE6浏览器上出现背景,解决方案是作成PNG8
浏览器默认的margin和padding不一样。解决方案是加一个全局的*{margin:0;padding:0;}来统一
IE下,even对象有x,y属性,可是没有pageX,pageY属性; Firefox下,event对象有pageX,pageY属性,可是没有x,y属性
三、简述一下你对HTML语义化的理解?
用正确的标签作正确的事情。
html语义化让页面的内容结构化,结构更清晰,便于对浏览器、搜索引擎解析;
即便在没有样式CSS状况下也以一种文档格式显示,而且是容易阅读的;
搜索引擎的爬虫也依赖于HTML标记来肯定上下文和各个关键字的权重,利于SEO;
便于阅读维护理解。
四、请描述一下 cookies,sessionStorage 和 localStorage 的区别?
是否携带:cookie是网站为了标示用户身份而储存在用户本地终端(Client Side)上的数据(一般通过加密),会在 http 请求中携带(即便不须要)
存储大小: cookie数据大小不能超过4k。 sessionStorage和localStorage 虽然也有存储大小的限制,但比cookie大得多,能够达到5M或更大。
有期时间: localStorage 存储持久数据,浏览器关闭后数据不丢失除非主动删除数据; sessionStorage 数据在当前浏览器窗口关闭后自动删除。 cookie 设置的cookie过时时间以前一直有效,即便窗口或浏览器关闭
*iframe会阻塞主页面的加载(Onload事件)
*不利于搜索引擎优化;
若是须要使用iframe,最好是经过javascript 动态给iframe添加src属性值,这样能够绕开以上两个问题。
WebSocket、SharedWorker;
也能够调用localstorge、cookies等本地存储方式;
localstorge另外一个浏览上下文里被添加、修改或删除时,它都会触发一个事件 storage
圆角 (border-radius:8px)
阴影 (Shadow\Reflect)
文字特效 (text-shadow、)
线性渐变 (gradient)
旋转 (transform) 缩放,定位,动画等,例如:transform:\scale(0.85,0.90)\ translate(0px,-30px)\ skew(-9deg,0deg)\Animation:
node_modules
中的文件,固然这样作还不够,咱们还能够将 Babel 编译过的文件缓存起来loader: 'babel-loader?cacheDirectory=true'
一、描述一下React 生命周期
渲染过程调用到的生命周期函数,主要几个要知道; * constructor * getInitialState * getDefaultProps * componentWillMount * render * componentDidMount 更新过程 * componentWillReceiveProps * shouldComponentUpdate * componentWillUpdate * render * componentDidUpdate 卸载过程 componentWillUnmount
二、实现组件有哪些方式?
React.createClass 使用API来定义组件 React ES6 class component 用 ES6 的class 来定义组件 Functional stateless component 经过函数定义无状态组件
三、应该在React生命周期的什么阶段发出ajax请求,为何?
AJAX请求应在 componentDidMount函数 进行请求。由于此时组件已经挂载安装,保证了数据更新后对应的组件也能更新
四、当组件的setState函数被调用以后,发生了什么?
React 会将传入的参数与组件当前的状态合并,生成新的状态 一> 根据新的状态构建 React 元素树 一> 计算出新的树与老树的节点差别,进行最小化重渲染
五、为何循环产生的组件中要利用上key这个特殊的prop?
Keys负责帮助React跟踪列表中哪些元素被改变/添加/移除。React利用子元素的key在比较新旧元素树的时候,快速得知一个元素是新的仍是刚刚被移除。
六、介绍redux,主要解决什么问题
一个组件所须要的数据,必须由父组件传过来,而不能像 flux 中直接从 store 取。
当一个组件相关数据更新时,即便父组件不须要用到这个组件,父组件仍是会从新 render,可能会有效率影响,或者须要写复杂的 shouldComponentUpdate 进行判断。
把树形结构按照层级分解,只比较同级元素。
给列表结构的每一个单元添加惟一的 key 属性,方便比较。
合并操做,调用 component 的 setState 方法的时候, React 将其标记为 dirty.到每个事件循环结束, React 检查全部标记 dirty 的 component 从新绘制.
选择性子树渲染。开发人员能够重写 shouldComponentUpdate 提升 diff 的性能
八、介绍react优化
用 shouldComponentUpdate 避免资源浪费
复杂的页面不要在一个组件里面写完。const element
。setTimeOut
或不可控的refs、DOM操做。props
和state
的数据尽量简单明了,扁平化。return null
而不是CSS的display:none
来控制节点的显示隐藏。保证同一时间页面的DOM节点尽量的少减小DOM操做、避免全局变量、
将样式表放在顶部,将脚本放在底部、
小图片(<10kb)转换base64编码、资源按需加载等。一、函数节流和防抖
debounce:把触发很是频繁的事件(好比按键搜索)合并成一次执行。
throttle:保证每 X 毫秒恒定的执行次数,好比每200ms检查下滚动位置,并触发 CSS 动画或请求数据。
requestAnimationFrame:可替代 throttle ,函数须要从新计算和渲染屏幕上的元素时,想保证动画或变化的平滑性,能够用它。注意:IE9 不支持。
二、介绍事件代理以及优缺点
在js中,当咱们移除某个元素但没有将元素和监听函数进行解绑时,事件处理函数依旧会留在内存中,没法被当成垃圾回收。
function delegateEvent(interfaceEle, selector, type, fn) { if(interfaceEle.addEventListener){ interfaceEle.addEventListener(type, eventfn); }else{ interfaceEle.attachEvent("on"+type, eventfn); } function eventfn(e){ var e = e || window.event; var target = e.target || e.srcElement; //若是目标元素与选择器匹配则执行函数 if (matchSelector(target, selector)) { if(fn) { //将fn内部的this指向target(在此以前this都是指向的绑定事件的元素即interfaceEle) fn.call(target, e); } } } }
e.stopPropagation
,只能阻止 React 模拟的事件冒泡,并不能阻止真实的 DOM 事件冒泡,更加不能阻止已经触发元素的多个事件的依次执行。在这种状况下,只有原生事件对象的 stopImmediatePropagation
能作到。本质上,内存泄漏能够定义为:应用程序再也不须要占用内存的时候,因为某些缘由,内存没有被操做系统或可用内存池回收
因此,确保用完之后把它设置为 null 或者从新定义
前端架构主要解决的是高复用性,架构能力提高方向主要是组件库开发、前端框架实现
在观察者模式中,观察者是知道Subject的,Subject一直保持对观察者进行记录。然而,在发布订阅模式中,发布者和订阅者不知道对方的存在。它们只有经过消息代理进行通讯。
在发布订阅模式中,组件是松散耦合的,正好和观察者模式相反。
观察者模式大多数时候是同步的,好比当事件触发,Subject就会去调用观察者的方法。而发布-订阅模式大多数时候是异步的(使用消息队列)。
一、HTTP2.0和HTTP1.X相比的新特性
二、经过什么作到并发请求
对请求并发数进行限制,而且使用排队机制让请求有序的发送出去
三、http1.1时如何复用tcp链接
使用 keep-alive
四、三次握手、四次挥手
客户端发送FIN报文,没有数据要发给你了
Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者经过注入恶意脚本,使之在用户的浏览器上运行
内容安全策略 (CSP) 本质上就是创建白名单,开发者明确告诉浏览器哪些外部资源能够加载和执行
一般能够经过两种方式来开启 CSP:
Content-Security-Policy
meta
标签的方式 <meta http-equiv="Content-Security-Policy">
示例:
只容许加载本站资源
Content-Security-Policy: default-src ‘self’
只容许加载 HTTPS 协议图片
Content-Security-Policy: img-src https://*
CSRF(Cross-site request forgery)跨站请求伪造:冒充用户执行某项操做的目的
示例:
2007年Gmail的CSRF漏洞:点开一个黑客的连接,全部邮件都被窃取(攻击者诱导用户进入某个页面,在页面中经过表单提交 POST
请求,也说明了表单是能够进行跨域攻击的)
2008年YouTube上几乎全部用户能够操做的动做都存在CSRF漏洞
2012年WordPress发现了一个操做用户帐户的CSRF漏洞:攻击者引导用户先进入目标的WordPress,而后点击其钓鱼站点上的某个按钮,该按钮其实是表单提交按钮,会添加某个具备管理员权限的用户
点击劫持是一种视觉欺骗的攻击手段。攻击者将须要攻击的网站经过
iframe
嵌套的方式嵌入本身的网页中,并将iframe
设置为透明,在页面中透出一个按钮诱导用户点击。
X-FRAME-OPTIONS
是一个 HTTP 响应头,在现代浏览器有一个很好的支持。这个 HTTP 响应头 就是为了防护用 iframe
嵌套的点击劫持攻击。
DENY
,表示页面不容许经过 iframe
的方式展现SAMEORIGIN
,表示页面能够在相同域名下经过 iframe
的方式展现ALLOW-FROM
,表示页面能够在指定来源的 iframe
中展现中间人攻击是攻击方同时与服务端和客户端创建起了链接,并让对方认为链接是安全的,可是实际上整个通讯过程都被攻击者控制了。攻击者不只能得到双方的通讯信息,还能修改通讯信息。如:不安全的公共 WIFI
urn:isbn:9780141036144
二、性能监控
只须要调用
performance.getEntriesByType('navigation') ,就能够得到页面中各类详细的性能相关信息
window.onerror
拦截报错Script error.
对于这种状况咱们须要给 script
标签添加 crossorigin
属性catch
的方式捕获错误。好比 Promise
能够直接使用 catch
函数,async await
可使用 try catch
script标签的crossorigin属性
crossorigin的属性值能够是
anonymous
、use-credentials
,会被浏览器默认作anonymous
。crossorigin的做用有三个:
- crossorigin会让浏览器启用CORS访问检查,检查http相应头的Access-Control-Allow-Origin
- 对于传统script须要跨域获取的js资源,控制暴露出其报错的详细信息
- 对于
module script
,控制用于跨域请求的凭据模式script标签的integrity属性
<script crossorigin="anonymous" integrity="sha256-PJJrxrJLzT6CCz1jDfQXTRWOO9zmemDQbmLtSlFQluc=" src="https://assets-cdn.github.com/assets/frameworks-3c926bc6b24bcd3e820b3d630df4174d158e3bdce67a60d06e62ed4a515096e7.js"></script>这是github源码,
integrity
告诉浏览器,使用sha256签名算法对下载的js文件进行计算,并与intergrity
提供的摘要签名对比,若是两者不一致,就不会执行这个资源。
- 减小由【托管在CDN的资源被篡改】而引入的XSS 风险
- 减小通讯过程资源被篡改而引入的XSS风险(同时使用https会更保险
script标签的
async
和defer
属性
async
仅适用于外链,规定脚本异步执行:不会按照出现的顺序执行,执行的时候,有可能页面还没解析完成,不会阻塞页面解析
defer
仅适用于外链,规定脚本延迟执行:会按照出现的顺序执行,在html解析完成后, DOMContentLoaded以前执行,不会阻塞页面解析