转载于https://github.com/poetries/FE-Interview-Questions,by poetriesjavascript
title
、description
、keywords
:搜索对着三项的权重逐个减少,title
值强调重点便可,重要关键词出现不要超过2次,并且要靠前,不一样页面title
要有所不一样;description
把页面内容高度归纳,长度合适,不可过度堆砌关键词,不一样页面description
有所不一样;keywords
列举出重要关键词便可HTML
代码,符合W3C规范:语义化代码让搜索引擎容易理解网页HTML
代码放在最前:搜索引擎抓取HTML
顺序是从上到下,有的搜索引擎对抓取长度有限制,保证重要内容必定会被抓取js
输出:爬虫不会执行js获取内容iframe
:搜索引擎不会抓取iframe
中的内容alt
<img>
的title
和alt
有什么区别alt
是<img>
的特有属性,是图片内容的等价描述,用于图片没法加载时显示、读屏器阅读图片。可提图片高可访问性,除了纯装饰图片外都必须设置有意义的值,搜索引擎会重点分析。GET
方法css
POST
方法html
URL
指定的资源提交数据或附加新的数据PUT
方法前端
POST
方法很像,也是想服务器提交数据。可是,它们之间有不一样。PUT
指定了资源在服务器上的位置,而POST
没有HEAD
方法vue
DELETE
方法html5
OPTIONS
方法java
URL
所支持的方法。若是请求成功,会有一个Allow
的头包含相似“GET,POST”
这样的信息TRACE
方法node
TRACE
方法被用于激发一个远程的,应用层的请求消息回路CONNECT
方法react
TCP/IP
通道基础版本jquery
URL
交给DNS
域名解析,找到真实IP
,向服务器发起请求;HTML、JS、CSS
、图象等);HTML、JS、CSS
等)进行语法解析,创建相应的内部数据结构(如HTML
的DOM
);详细版
Expires
和Cache-Control
:
script
,meta
这样自己不可见的标签。2)被css隐藏的节点,如display: none
详细简版
从浏览器接收url
到开启网络请求线程(这一部分能够展开浏览器的机制以及进程与线程之间的关系)
开启网络线程到发出一个完整的http
请求(这一部分涉及到dns查询,tcp/ip
请求,五层因特网协议栈等知识)
从服务器接收到请求到对应后台接收到请求(这一部分可能涉及到负载均衡,安全拦截以及后台内部的处理等等)
后台和前台的http
交互(这一部分包括http
头部、响应码、报文结构、cookie
等知识,能够提下静态资源的cookie
优化,以及编码解码,如gzip
压缩等)
单独拎出来的缓存问题,http
的缓存(这部分包括http缓存头部,etag
,catch-control
等)
浏览器接收到http
数据包后的解析流程(解析html
-词法分析而后解析成dom
树、解析css
生成css
规则树、合并成render
树,而后layout
、painting
渲染、复合图层的合成、GPU
绘制、外链资源的处理、loaded
和domcontentloaded
等)
CSS
的可视化格式模型(元素的渲染规则,如包含块,控制框,BFC
,IFC
等概念)
JS
引擎解析过程(JS
的解释阶段,预处理阶段,执行阶段生成执行上下文,VO
,做用域链、回收机制等等)
其它(能够拓展不一样的知识模块,如跨域,web安全,hybrid
模式等等内容)
content
方面
HTTP
请求:合并文件、CSS
精灵、inline Image
DNS
查询:DNS
缓存、将资源分布到恰当数量的主机名DOM
元素数量Server
方面
CDN
ETag
Gzip
压缩Cookie
方面
cookie
大小css
方面
CSS
表达式<link>
不使用@import
Javascript
方面
javascript
和css
从外部引入javascript
和css
DOM
访问图片方面
css
精灵HTML
中拉伸图片1XX
:信息状态码
100 Continue
继续,通常在发送post
请求时,已发送了http header
以后服务端将返回此信息,表示确认,以后发送具体参数信息2XX
:成功状态码
200 OK
正常返回信息201 Created
请求成功而且服务器建立了新的资源202 Accepted
服务器已接受请求,但还没有处理3XX
:重定向
301 Moved Permanently
请求的网页已永久移动到新位置。302 Found
临时性重定向。303 See Other
临时性重定向,且老是使用 GET
请求新的 URI
。304 Not Modified
自从上次请求后,请求的网页未修改过。4XX
:客户端错误
400 Bad Request
服务器没法理解请求的格式,客户端不该当尝试再次使用相同的内容发起请求。401 Unauthorized
请求未受权。403 Forbidden
禁止访问。404 Not Found
找不到如何与 URI
相匹配的资源。5XX:
服务器错误
500 Internal Server Error
最多见的服务器端错误。503 Service Unavailable
服务器端暂时没法处理请求(多是过载或维护)。html
语义化就是让页面的内容结构化,便于对浏览器、搜索引擎解析;CSS
状况下也以一种文档格式显示,而且是容易阅读的。SEO
。主要分红两部分:渲染引擎(layout engineer
或Rendering Engine
)和JS
引擎
渲染引擎:负责取得网页的内容(HTML
、XML
、图像等等)、整理讯息(例如加入CSS
等),以及计算网页的显示方式,而后会输出至显示器或打印机。浏览器的内核的不一样对于网页的语法解释会有不一样,因此渲染的效果也不相同。全部网页浏览器、电子邮件客户端以及其它须要编辑、显示网络内容的应用程序都须要内核
JS
引擎则:解析和执行javascript
来实现网页的动态效果
最开始渲染引擎和JS
引擎并无区分的很明确,后来JS引擎愈来愈独立,内核就倾向于只指渲染引擎
HTML5
如今已经不是 SGML
的子集,主要是关于图像,位置,存储,多任务等功能的增长
canvas
video
和 audio
元素localStorage
长期存储数据,浏览器关闭后数据不丢失sessionStorage
的数据在浏览器关闭后自动删除article
、footer
、header
、nav
、section
calendar
、date
、time
、email
、url
、search
webworker
, websocket
, Geolocation
移除的元素:
basefont
,big
,center
,font
, s
,strike,
tt,u`frame
,frameset
,noframes
支持HTML5
新标签:
IE8/IE7/IE6
支持经过document.createElement
方法产生的标签持HTML5
新标签固然也能够直接使用成熟的框架、好比html5shim
HTML5
的离线储存怎么使用,工做原理能不能解释一下?在用户没有与因特网链接时,能够正常访问站点或应用,在用户与因特网链接时,更新用户机器上的缓存文件
原理:HTML5
的离线存储是基于一个新建的.appcache
文件的缓存机制(不是存储技术),经过这个文件上的解析清单离线存储资源,这些资源就会像cookie
同样被存储了下来。以后当网络在处于离线状态下时,浏览器会经过被离线存储的数据进行页面展现
如何使用:
manifest
的属性;cache.manifest
文件的编写离线存储的资源window.applicationCache
进行需求实现CACHE MANIFEST #v0.11 CACHE: js/app.js css/style.css NETWORK: resourse/logo.png FALLBACK: / /offline.html
HTML5
的离线储存资源进行管理和加载的呢在线的状况下,浏览器发现html
头部有manifest
属性,它会请求manifest
文件,若是是第一次访问app
,那么浏览器就会根据manifest文件的内容下载相应的资源而且进行离线存储。若是已经访问过app
而且资源已经离线存储了,那么浏览器就会使用离线的资源加载页面,而后浏览器会对比新的manifest
文件与旧的manifes
t文件,若是文件没有发生改变,就不作任何操做,若是文件改变了,那么就会从新下载文件中的资源并进行离线存储。
离线的状况下,浏览器就直接使用离线存储的资源。
cookies
,sessionStorage
和 localStorage
的区别?cookie
是网站为了标示用户身份而储存在用户本地终端(Client Side)上的数据(一般通过加密)
cookie数据始终在同源的http请求中携带(即便不须要),记会在浏览器和服务器间来回传递
sessionStorage
和localStorage
不会自动把数据发给服务器,仅在本地保存
存储大小:
cookie
数据大小不能超过4ksessionStorage
和localStorage
虽然也有存储大小的限制,但比cookie
大得多,能够达到5M或更大有期时间:
localStorage
存储持久数据,浏览器关闭后数据不丢失除非主动删除数据sessionStorage
数据在当前浏览器窗口关闭后自动删除cookie
设置的cookie
过时时间以前一直有效,即便窗口或浏览器关闭iframe
会阻塞主页面的Onload
事件SEO
iframe
和主页面共享链接池,而浏览器对相同域的链接有限制,因此会影响页面的并行加载iframe
以前须要考虑这两个缺点。若是须要使用iframe
,最好是经过javascript
动态给iframe
添加src
属性值,这样能够绕开以上两个问题css
和js
、结构行为表现的分离一个是功能上的差异
XHTML
可兼容各大浏览器、手机以及PDA
,而且浏览器也能快速正确地编译网页另外是书写习惯的差异
XHTML
元素必须被正确地嵌套,闭合,区分大小写,文档必须拥有根元素link
会同时被加载,而@imort
页面被加载的时,link
会同时被加载,而@import
引用的CSS
会等到页面被加载完再加载import
只在IE5
以上才能识别,而link
是XHTML
标签,无兼容问题link
方式的样式的权重 高于@import
的权重<!DOCTYPE>
声明位于文档中的最前面,处于 <html>
标签以前。告知浏览器的解析器, 用什么文档类型 规范来解析这个文档JS
运做模式是 以该浏览器支持的最高标准运行DOCTYPE
不存在或格式不正确会致使文档以混杂模式呈现a b span img input select strong
div ul ol li dl dt dd h1 h2 h3 h4…p
<br> <hr> <img> <input> <link> <meta>
class
:为元素设置类标识data-*
: 为元素增长自定义属性draggable
: 设置元素是否可拖拽id
: 元素id
,文档内惟一lang
: 元素内容的的语言style
: 行内css
样式title
: 元素相关的建议信息svg
绘制出来的每个图形的元素都是独立的DOM
节点,可以方便的绑定事件或用来修改。canvas
输出的是一整幅画布svg
输出的图形是矢量图形,后期能够修改参数来自由放大缩小,不会是真和锯齿。而canvas
输出标量画布,就像一张图片同样,放大会失真或者锯齿HTML5
不基于 SGML
,所以不须要对DTD
进行引用,可是须要doctype
来规范浏览器的行为HTML4.01
基于SGML
,因此须要对DTD
进行引用,才能告知浏览器文档所使用的文档类型svg
border-radius
js
实现 须要求一个点在不在圆上简单算法、获取鼠标坐标等等<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" /> // width 设置viewport宽度,为一个正整数,或字符串‘device-width’ // device-width 设备宽度 // height 设置viewport高度,通常设置了宽度,会自动解析出高度,能够不用设置 // initial-scale 默认缩放比例(初始缩放比例),为一个数字,能够带小数 // minimum-scale 容许用户最小缩放比例,为一个数字,能够带小数 // maximum-scale 容许用户最大缩放比例,为一个数字,能够带小数 // user-scalable 是否容许手动缩放
1px
被 渲染成 2px
问题局部处理
mate
标签中的 viewport
属性 ,initial-scale
设置为 1
rem
按照设计稿标准走,外加利用transfrome
的scale(0.5)
缩小一倍便可;全局处理
mate
标签中的 viewport
属性 ,initial-scale
设置为 0.5
rem
按照设计稿标准走便可禁止使用iframe
(阻塞父文档onload
事件)
iframe
会阻塞主页面的Onload
事件iframe
和主页面共享链接池,而浏览器对相同域的链接有限制,因此会影响页面的并行加载iframe
以前须要考虑这两个缺点。若是须要使用iframe
,最好是经过javascript
iframe
添加src
属性值,这样能够绕开以上两个问题禁止使用gif
图片实现loading
效果(下降CPU
消耗,提高渲染性能)
使用CSS3
代码代替JS
动画(尽量避免重绘重排以及回流)
对于一些小图标,能够使用base64位编码,以减小网络请求。但不建议大图使用,比较耗费CPU
HTTP
请求页面头部的<style></style>
<script</script>
会阻塞页面;(由于 Renderer
进程中 JS
线程和渲染线程是互斥的)
页面中空的 href
和 src
会阻塞页面其余资源的加载 (阻塞下载进程)
网页Gzip
,CDN
托管,data
缓存 ,图片服务器
前端模板 JS+数据,减小因为HTML
标签致使的带宽浪费,前端用变量保存AJAX请求结果,每次操做本地变量,不用请求,减小请求次数
用innerHTML
代替DOM
操做,减小DOM
操做次数,优化javascript
性能
当须要设置的样式不少时设置className
而不是直接操做style
少用全局变量、缓存DOM
节点查找的结果。减小IO
读取操做
图片预加载,将样式表放在顶部,将脚本放在底部 加上时间戳
对普通的网站有一个统一的思路,就是尽可能向前端优化、减小数据库操做、减小磁盘IO
<!DOCTYPE html> <!--H5标准声明,使用 HTML5 doctype,不区分大小写--> <head lang=”en”> <!--标准的 lang 属性写法--> <meta charset=’utf-8′> <!--声明文档使用的字符编码--> <meta http-equiv=”X-UA-Compatible” content=”IE=edge,chrome=1″/> <!--优先使用 IE 最新版本和 Chrome--> <meta name=”description” content=”不超过150个字符”/> <!--页面描述--> <meta name=”keywords” content=””/> <!-- 页面关键词--> <meta name=”author” content=”name, email@gmail.com”/> <!--网页做者--> <meta name=”robots” content=”index,follow”/> <!--搜索引擎抓取--> <meta name=”viewport” content=”initial-scale=1, maximum-scale=3, minimum-scale=1, user-scalable=no”> <!--为移动设备添加 viewport--> <meta name=”apple-mobile-web-app-title” content=”标题”> <!--iOS 设备 begin--> <meta name=”apple-mobile-web-app-capable” content=”yes”/> <!--添加到主屏后的标题(iOS 6 新增) 是否启用 WebApp 全屏模式,删除苹果默认的工具栏和菜单栏--> <meta name=”apple-itunes-app” content=”app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL”> <!--添加智能 App 广告条 Smart App Banner(iOS 6+ Safari)--> <meta name=”apple-mobile-web-app-status-bar-style” content=”black”/> <meta name=”format-detection” content=”telphone=no, email=no”/> <!--设置苹果工具栏颜色--> <meta name=”renderer” content=”webkit”> <!-- 启用360浏览器的极速模式(webkit)--> <meta http-equiv=”X-UA-Compatible” content=”IE=edge”> <!--避免IE使用兼容模式--> <meta http-equiv=”Cache-Control” content=”no-siteapp” /> <!--不让百度转码--> <meta name=”HandheldFriendly” content=”true”> <!--针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,好比黑莓--> <meta name=”MobileOptimized” content=”320″> <!--微软的老式浏览器--> <meta name=”screen-orientation” content=”portrait”> <!--uc强制竖屏--> <meta name=”x5-orientation” content=”portrait”> <!--QQ强制竖屏--> <meta name=”full-screen” content=”yes”> <!--UC强制全屏--> <meta name=”x5-fullscreen” content=”true”> <!--QQ强制全屏--> <meta name=”browsermode” content=”application”> <!--UC应用模式--> <meta name=”x5-page-mode” content=”app”> <!-- QQ应用模式--> <meta name=”msapplication-tap-highlight” content=”no”> <!--windows phone 点击无高光 设置页面不缓存--> <meta http-equiv=”pragma” content=”no-cache”> <meta http-equiv=”cache-control” content=”no-cache”> <meta http-equiv=”expires” content=”0″>
IE
: trident
内核Firefox
:gecko
内核Safari
:webkit
内核Opera
:之前是presto
内核,Opera
现已改用Google - Chrome
的Blink
内核Chrome:Blink
(基于webkit
,Google与Opera Software共同开发)css
文件。seo
)搜索引擎更友好,排名更容易靠前。alt(alt text)
:为不能显示图像、窗体或applets
的用户代理(UA
),alt
属性用来指定替换文字。替换文字的语言由lang
属性指定。(在IE浏览器下会在没有title
时把alt
当成 tool tip
显示)
title(tool tip)
:该属性为设置该属性的元素提供建议性的信息
strong
:粗体强调标签,强调,表示内容的重要性
em
:斜体强调标签,更强烈强调,表示内容的强调点
区别:优雅降级是从复杂的现状开始,并试图减小用户体验的供给,而渐进加强则是从一个很是基础的,可以起做用的版本开始,并不断扩充,以适应将来环境的须要。降级(功能衰减)意味着往回看;而渐进加强则意味着朝前看,同时保证其根基处于安全地带
CDN
缓存更方便cookie
带宽src
用于替换当前元素,href用于在当前文档和引用资源之间确立联系。src
是source
的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求src
资源时会将其指向的资源下载并应用到文档内,例如js
脚本,img
图片和frame
等元素
<script src ="js.js"></script>
当浏览器解析到该元素时,会暂停其余资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等元素也如此,相似于将所指向资源嵌入当前标签内。这也是为何将js脚本放在底部而不是头部
href
是Hypertext Reference
的缩写,指向网络资源所在位置,创建和当前元素(锚点)或当前文档(连接)之间的连接,若是咱们在文档中添加<link href="common.css" rel="stylesheet"/>
那么浏览器会识别该文档为css
文件,就会并行下载资源而且不会中止对当前文档的处理。这也是为何建议使用link
方式来加载css
,而不是使用@import
方式png-8
,png-24
,jpeg
,gif
,svg
可是上面的那些都不是面试官想要的最后答案。面试官但愿听到是
Webp
,Apng
。(是否有关注新技术,新鲜事物)
WebP
格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式。图片压缩体积大约只有JPEG
的2/3
,并能节省大量的服务器带宽资源和数据空间。Facebook Ebay
等知名网站已经开始测试并使用WebP
格式。40%
。“Animated Portable Network Graphics”
, 是PNG的位图动画扩展,能够实现png格式的动态图片效果。04年诞生,但一直得不到各大浏览器厂商的支持,直到日前获得 iOS safari 8
的支持,有望代替GIF
成为下一代动态图标准
dns
缓存,cdn
缓存,浏览器缓存,服务器缓存
CSSsprite
,SVGsprite
,Iconfont
、Base64
等技术。cookie
session
url
重写input
ip
地址GET /Protocols/rfc2616/rfc2616-sec5.html HTTP/1.1 Host: www.w3.org Connection: keep-alive Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 Referer: https://www.google.com.hk/ Accept-Encoding: gzip,deflate,sdch Accept-Language: zh-CN,zh;q=0.8,en;q=0.6 Cookie: authorstyle=yes If-None-Match: "2cc8-3e3073913b100" If-Modified-Since: Wed, 01 Sep 2004 13:24:52 GMT name=qiu&age=25
HTTP/1.1 200 OK Date: Tue, 08 Jul 2014 05:28:43 GMT Server: Apache/2 Last-Modified: Wed, 01 Sep 2004 13:24:52 GMT ETag: "40d7-3e3073913b100" Accept-Ranges: bytes Content-Length: 16599 Cache-Control: max-age=21600 Expires: Tue, 08 Jul 2014 11:28:43 GMT P3P: policyref="http://www.w3.org/2001/05/P3P/p3p.xml" Content-Type: text/html; charset=iso-8859-1 {"name": "qiu", "age": 25}
概念:将多个小图片拼接到一个图片中。经过background-position
和元素尺寸调节须要显示的背景图案。
优势:
HTTP
请求数,极大地提升页面加载速度缺点:
display: none;
与visibility: hidden;
的区别联系:它们都能让元素不可见
区别:
display:none
;会让元素彻底从渲染树中消失,渲染的时候不占据任何空间;visibility: hidden
;不会让元素从渲染树消失,渲染师元素继续占据空间,只是内容不可见display: none
;是非继承属性,子孙节点消失因为元素从渲染树消失形成,经过修改子孙节点属性没法显示;visibility: hidden;
是继承属性,子孙节点消失因为继承了hidden
,经过设置visibility: visible;
可让子孙节点显式display
一般会形成文档重排。修改visibility
属性只会形成本元素的重绘。display: none
;元素内容;会读取visibility: hidden;
元素内容link
与@import
的区别link
是HTML
方式, @import
是CSS方式link
最大限度支持并行下载,@import
过多嵌套致使串行下载,出现FOUC
link
能够经过rel="alternate stylesheet"
指定候选样式link
支持早于@import
,能够使用@import
对老浏览器隐藏样式@import
必须在样式规则以前,能够在css文件中引用其余文件link
优于@import
Flash Of Unstyled Content
:用户定义样式表加载以前浏览器使用默认样式显示文档,用户样式加载渲染以后再重新显示文档,形成页面闪烁。head
建立规则:
float
不是none
)position
取值为absolute
或fixed
)display
取值为inline-block
,table-cell
, table-caption
,flex
, inline-flex
之一的元素overflow
不是visible
的元素做用:
margin
折叠display
为none
,那么position
和float
都不起做用,这种状况下元素不产生框position
值为absolute
或者fixed
,框就是绝对定位的,float
的计算值为none
,display
根据下面的表格进行调整。float
不是none
,框是浮动的,display
根据下表进行调整display
根据下表进行调整display
的值为指定值display
div
定义height
div
标签clear:both
div
定义伪类:after
和zoom
div
定义overflow:hidden
div
也浮动,须要定义宽度br
标签clear:both
CSS
初始化每每会出现浏览器之间的页面显示差别。SEO
有必定的影响,但鱼和熊掌不可兼得,但力求影响最小的状况下初始化css
选择器border-radius
text-shadow
transform
CSS3新增伪类有那些?
p:first-of-type
选择属于其父元素的首个<p>
元素的每一个<p>
元素。p:last-of-type
选择属于其父元素的最后 <p>
元素的每一个<p>
元素。p:only-of-type
选择属于其父元素惟一的 <p>
元素的每一个 <p>
元素。p:only-child
选择属于其父元素的惟一子元素的每一个 <p>
元素。p:nth-child(2)
选择属于其父元素的第二个子元素的每一个 <p>
元素。:after
在元素以前添加内容,也能够用来作清除浮动。:before
在元素以后添加内容:enabled
:disabled
控制表单控件的禁用状态。:checked
单选框或复选框被选中block
象块类型元素同样显示。none
缺省值。象行内元素类型同样显示。inline-block
象行内元素同样显示,但其内容象块类型元素同样显示。list-item
象块类型元素同样显示,并添加样式列表标记。table
此元素会做为块级表格来显示inherit
规定应该从父元素继承 display
属性的值IE
盒子模型、W3C
盒子模型;padding
)、边界(margin
)、 边框(border
);IE
的content
部分把 border
和 padding
计算了进去;!important > id > class > tag
important
比 内联优先级高absolute
:生成绝对定位的元素,相对于 static
定位之外的第一个父元素进行定位fixed
:生成绝对定位的元素,相对于浏览器窗口进行定位relative
:生成相对定位的元素,相对于其正常位置进行定位static
默认值。没有定位,元素出如今正常的流中inherit
规定从父元素继承 position
属性的值margin
负值font-size:0
letter-spacing
word-spacing
GIF
8
位像素,256
色boolean
透明JPEG
256
PNG
PNG8
和truecolor PNG
PNG8
相似GIF
颜色上限为256
,文件小,支持alpha
透明度,无动画display:block
;。但若是元素设置了浮动后再设置display:block
;那就不会占一行。:
)用于CSS3伪类,双冒号(::
)用于CSS3
伪元素60Hz
,即1
秒刷新60
次,因此理论上最小间隔为1/60*1000ms = 16.7ms
@import
引入多个css
文件,能够使用CSS
工具将CSS
合并为一个CSS
文件,例如使用Sass\Compass
等!important
规则最重要,大于其它规则1000
ID
属性值,加100
10
position
、display
、float
、width
、heigh
t、margin
、padding
、top
、left
、right
、`css
压缩与合并、Gzip
压缩css
文件放在head
里、不要用@import
CSS3
中提出的三个属性:transition
、transform
、animation
transition
:定义了元素在变化过程当中是怎么样的,包含transition-property
、transition-duration
、transition-timing-function
、transition-delay
。transform
:定义元素的变化结果,包含rotate
、scale
、skew
、translate
。animation
:动画定义了动做的每一帧(@keyframes
)有什么效果,包括animation-name
,animation-duration
、animation-timing-function
、animation-delay
、animation-iteration-count
、animation-direction
http
请求CPU
进行编解码.left { float: left; width: 100px; height: 200px; background: red; } .right { float: right; width: 200px; height: 200px; background: blue; } .main { margin-left: 120px; margin-right: 220px; height: 200px; background: green; } <div class="container"> <div class="left"></div> <div class="right"></div> <div class="main"></div> </div>
.container { margin-left: 120px; margin-right: 220px; } .main { float: left; width: 100%; height:300px; background: green; } .left { position: relative; left: -120px; float: left; height: 300px; width: 100px; margin-left: -100%; background: red; } .right { position: relative; right: -220px; float: right; height: 300px; width: 200px; margin-left: -200px; background: blue; } <div class="container"> <div class="main"></div> <div class="left"></div> <div class="right"></div> </div>
.content { float: left; width: 100%; } .main { height: 200px; margin-left: 110px; margin-right: 220px; background: green; } .main::after { content: ''; display: block; font-size:0; height: 0; zoom: 1; clear: both; } .left { float:left; height: 200px; width: 100px; margin-left: -100%; background: red; } .right { float: right; height: 200px; width: 200px; margin-left: -200px; background: blue; } <div class="content"> <div class="main"></div> </div> <div class="left"></div> <div class="right"></div>
Scss
和LESS
语法较为严谨,LESS
要求必定要使用大括号“{}”,Scss
和Stylus
能够经过缩进表示层次与嵌套关系Scss
无全局变量的概念,LESS
和Stylus
有相似于其它语言的做用域概念Sass
是基于Ruby
语言的,而LESS
和Stylus
能够基于NodeJS
NPM
下载相应库后进行编译;PostCSS
提供了一个解析器,它可以将 CSS
解析成抽象语法树PostCSS
这个平台上,咱们可以开发一些插件,来处理咱们的CSS
,好比热门的:autoprefixer
postcss
能够对sass处理事后的css
再处理 最多见的就是autoprefixer
!important
banner
等固定文案label(for)
和id
input
:checked + label
base64
的使用HTTP
请求base64
的体积约为原图的4/3
思路:
margin
撑开div
包含,而后靠负margin
造成bfc
flex
知道是要用
css3
。使用animation
动画实现一个简单的幻灯片效果
/**css**/ .ani{ width:480px; height:320px; margin:50px auto; overflow: hidden; box-shadow:0 0 5px rgba(0,0,0,1); background-size: cover; background-position: center; -webkit-animation-name: "loops"; -webkit-animation-duration: 20s; -webkit-animation-iteration-count: infinite; } @-webkit-keyframes "loops" { 0% { background:url(http://d.hiphotos.baidu.com/image/w%3D400/sign=c01e6adca964034f0fcdc3069fc27980/e824b899a9014c08e5e38ca4087b02087af4f4d3.jpg) no-repeat; } 25% { background:url(http://b.hiphotos.baidu.com/image/w%3D400/sign=edee1572e9f81a4c2632edc9e72b6029/30adcbef76094b364d72bceba1cc7cd98c109dd0.jpg) no-repeat; } 50% { background:url(http://b.hiphotos.baidu.com/image/w%3D400/sign=937dace2552c11dfded1be2353266255/d8f9d72a6059252d258e7605369b033b5bb5b912.jpg) no-repeat; } 75% { background:url(http://g.hiphotos.baidu.com/image/w%3D400/sign=7d37500b8544ebf86d71653fe9f9d736/0df431adcbef76095d61f0972cdda3cc7cd99e4b.jpg) no-repeat; } 100% { background:url(http://c.hiphotos.baidu.com/image/w%3D400/sign=cfb239ceb0fb43161a1f7b7a10a54642/3b87e950352ac65ce2e73f76f9f2b21192138ad1.jpg) no-repeat; } }
外边距重叠就是margin-collapse
折叠结果遵循下列计算规则:
rgba()
和opacity
都能实现透明效果,但最大的不一样是opacity
做用于元素,以及元素内的全部内容的透明度,rgba()
只做用于元素的颜色或其背景色。(设置rgba
透明的元素的子元素不会继承透明效果!)line-height
letter-spacing
/**方法一:已知元素的高宽**/ #div1{ background-color:#6699FF; width:200px; height:200px; position: absolute; //父元素须要相对定位 top: 50%; left: 50%; margin-top:-100px ; //二分之一的height,width margin-left: -100px; }
/**方法二:**/ #div1{ width: 200px; height: 200px; background-color: #6699FF; margin:auto; position: absolute; //父元素须要相对定位 left: 0; top: 0; right: 0; bottom: 0; } 如何垂直居中一个<img>?(用更简便的方法。) #container /**<img>的容器设置以下**/ { display:table-cell; text-align:center; vertical-align:middle; }
px
和em
都是长度单位,区别是,px
的值是固定的,指定是多少就是多少,计算比较容易。em
得值不是固定的,而且em
会继承父级元素的字体大小。16px
。因此未经调整的浏览器都符合: 1em=16px
。那么12px=0.75em
, 10px=0.625em
。CSS
预处理器。他是CSS
上的一种抽象层。他们是一种特殊的语法/语言编译成CSS
。LESS
既能够在客户端上运行 (支持IE 6+
, Webkit
, Firefox
),也可一在服务端运行 (借助 Node.js
)为何要使用它们?
css的
content
属性专门应用在before/after
伪元素上,用于来插入生成内容。最多见的应用是利用伪类清除浮动。
/**一种常见利用伪类清除浮动的代码**/ .clearfix:after { content:"."; //这里利用到了content属性 display:block; height:0; visibility:hidden; clear:both; } .clearfix { *zoom:1; }
text-align:center
margin
为auto
;position
为relative
,元素设left:0;right:0;margin:auto;
flex-box
布局,指定justify-content
属性为centerdisplay
设置为tabel-ceil
display:table-cell
,同时设置vertial-align:middle
flex
布局,设置为align-item:center
bottom:0,top:0
,并设置margin:auto
top:50%,margin-top
值为高度一半的负值line-height
为height
值硬件加速是指经过建立独立的复合图层,让GPU来渲染这个图层,从而提升性能,
CSS
属性有transform
、opacity
、filter
,为了不2D动画在repaint
操做,通常使用tranform:translateZ(0)
减小重绘和重排的方法:
DOM
查询cssText
或者className
一次性改变属性fragment
animation
是css3新增的动画属性,这个css3动画的每一帧是经过@keyframes
来声明的,keyframes
声明了动画的名称,经过from
、to
或者是百分比来定义animation-name
来引用这个动画,同时css3动画也能够定义动画运行的时长、动画开始时间、动画播放方向、动画循环次数、动画播放的方式,animation-name
定义动画名、animation-duration
定义动画播放的时长、animation-delay
定义动画延迟播放的时间、animation-direction
定义animation-iteration-count
定义播放次数、animation-fill-mode
定义动画播放以后的状态、animation-play-state
定义播放状态,如暂停运行等、animation-timing-function
左侧固定宽度,右侧自适应宽度的两列布局实现
html结构
<div class="outer"> <div class="left">固定宽度</div> <div class="right">自适应宽度</div> </div>
在外层
div
(类名为outer
)的div
中,有两个子div
,类名分别为left
和right
,其中left
为固定宽度,而right
为自适应宽度
方法1:左侧div设置成浮动:float: left,右侧div宽度会自拉升适应
.outer { width: 100%; height: 500px; background-color: yellow; } .left { width: 200px; height: 200px; background-color: red; float: left; } .right { height: 200px; background-color: blue; }
方法2:对右侧:div进行绝对定位,而后再设置right=0,便可以实现宽度自适应
绝对定位元素的第一个高级特性就是其具备自动伸缩的功能,当咱们将
width
设置为auto
的时候(或者不设置,默认为auto
),绝对定位元素会根据其left
和right
自动伸缩其大小
.outer { width: 100%; height: 500px; background-color: yellow; position: relative; } .left { width: 200px; height: 200px; background-color: red; } .right { height: 200px; background-color: blue; position: absolute; left: 200px; top:0; right: 0; }
方法3:将左侧div进行绝对定位,而后右侧div设置margin-left: 200px
.outer { width: 100%; height: 500px; background-color: yellow; position: relative; } .left { width: 200px; height: 200px; background-color: red; position: absolute; } .right { height: 200px; background-color: blue; margin-left: 200px; }
方法4:使用flex布局
.outer { width: 100%; height: 500px; background-color: yellow; display: flex; flex-direction: row; } .left { width: 200px; height: 200px; background-color: red; } .right { height: 200px; background-color: blue; flex: 1; }
闭包就是可以读取其余函数内部变量的函数
闭包是指有权访问另外一个函数做用域中变量的函数,建立闭包的最多见的方式就是在一个函数内建立另外一个函数,经过另外一个函数访问这个函数的局部变量,利用闭包能够突破做用链域
闭包的特性:
说说你对闭包的理解
使用闭包主要是为了设计私有的方法和变量。闭包的优势是能够避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易形成内存泄露。在js中,函数即闭包,只有函数才会产生做用域的概念
闭包 的最大用处有两个,一个是能够读取函数内部的变量,另外一个就是让这些变量始终保持在内存中
闭包的另外一个用处,是封装对象的私有属性和私有方法
好处:可以实现封装和缓存等;
坏处:就是消耗内存、不正当使用会形成内存溢出的问题
使用闭包的注意点
window
对象即被终止,做用域链向下访问变量是不被容许的每一个对象都会在其内部初始化一个属性,就是prototype
(原型),当咱们访问一个对象的属性时
若是这个对象内部不存在这个属性,那么他就会去prototype
里找这个属性,这个prototype
又会有本身的prototype
,因而就这样一直找下去,也就是咱们平时所说的原型链的概念
关系:instance.constructor.prototype = instance.__proto__
特色:
JavaScript
对象是经过引用来传递的,咱们建立的每一个新对象实体中并无一份属于本身的原型副本。当咱们修改原型时,与之相关的对象也会继承这一改变当咱们须要一个属性的时,Javascript
引擎会先看当前对象中是否有这个属性, 若是没有的
就会查找他的Prototype
对象是否有这个属性,如此递推下去,一直检索到 Object
内建对象
Event Delegation
),又称之为事件委托。是 JavaScript
中经常使用绑定事件的经常使用技巧。顾名思义,“事件代理”便是把本来须要绑定的事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好处是能够提升性能table
上代理全部td
的click
事件就很是棒构造继承
原型继承
实例继承
拷贝继承
原型prototype
机制或apply
和call
方法去实现较简单,建议使用构造函数与原型混合方式
function Parent(){ this.name = 'wang'; } function Child(){ this.age = 28; } Child.prototype = new Parent();//继承了Parent,经过原型 var demo = new Child(); alert(demo.age); alert(demo.name);//获得被继承的属性 }
this
老是指向函数的直接调用者(而非间接调用者)new
关键字,this
指向new
出来的那个对象this
指向触发这个事件的对象,特殊的是,IE
中的attachEvent
中的this
老是指向全局对象Window
W3C
中定义事件的发生经历三个阶段:捕获阶段(capturing
)、目标阶段(targetin
)、冒泡阶段(bubbling
)
DOM
事件流:同时支持两种事件模型:捕获型事件和冒泡型事件W3c
中,使用stopPropagation()
方法;在IE下设置cancelBubble = true
click - <a>
后的跳转。在W3c
中,使用preventDefault()
方法,在IE
下设置window.event.returnValue = false
this
变量引用该对象,同时还继承了该函数的原型this
引用的对象中this
所引用,而且最后隐式的返回 this
Ajax
的原理简单来讲是在用户和服务器之间加了—个中间层(AJAX
引擎),经过XmlHttpRequest
对象来向服务器发异步请求,从服务器得到数据,而后用javascrip
t来操做DOM
而更新页面。使用户操做与服务器响应异步化。这其中最关键的一步就是从服务器得到请求数据Ajax
的过程只涉及JavaScript
、XMLHttpRequest
和DOM
。XMLHttpRequest
是aja
x的核心机制// 1. 建立链接 var xhr = null; xhr = new XMLHttpRequest() // 2. 链接服务器 xhr.open('get', url, true) // 3. 发送请求 xhr.send(null); // 4. 接受请求 xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ if(xhr.status == 200){ success(xhr.responseText); } else { // fail fail && fail(xhr.status); } } }
ajax 有那些优缺点?
Ajax
在客户端运行,承担了一部分原本由服务器承担的工做,减小了大用户量下的服务器负载。Ajax
能够实现动态不刷新(局部刷新)AJAX
暴露了与服务器交互的细节。首先了解下浏览器的同源策略 同源策略
/SOP(Same origin policy)
是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,若是缺乏了同源策略,浏览器很容易受到XSS
、CSFR
等攻击。所谓同源是指"协议+域名+端口"三者相同,即使两个不一样的域名指向同一个ip地址,也非同源
那么怎样解决跨域问题的呢?
var script = document.createElement('script'); script.type = 'text/javascript'; // 传参并指定回调执行函数为onBack script.src = 'http://www.....:8080/login?user=admin&callback=onBack'; document.head.appendChild(script); // 回调执行函数 function onBack(res) { alert(JSON.stringify(res)); }
此方案仅限主域相同,子域不一样的跨域应用场景
1.)父窗口:(http://www.domain.com/a.html)
<iframe id="iframe" src="http://child.domain.com/b.html"></iframe> <script> document.domain = 'domain.com'; var user = 'admin'; </script>
2.)子窗口:(http://child.domain.com/b.html)
document.domain = 'domain.com';
// 获取父窗口中变量
alert('get js data from parent ---> ' + window.parent.user);
var module1 = (function(){ var _count = 0; var m1 = function(){ //... }; var m2 = function(){ //... }; return { m1 : m1, m2 : m2 }; })();
IE
async
:script
,插入到DOM
中,加载完毕后callBack
setTimeout
的第一个参数使用字符串而非函数的话,会引起内存泄漏数据体积方面
JSON
相对于XML
来说,数据的体积小,传递的速度更快些。数据交互方面
JSON
与JavaScript
的交互更加方便,更容易解析处理,更好的数据交互数据描述方面
JSON
对数据的描述性比XML
较差传输速度方面
JSON
的速度要远远快于XML
WebPack
是一个模块打包工具,你能够使用WebPack
管理你的模块依赖,并编绎输出模块们所需的静态文件。它可以很好地管理、打包Web
开发中所用到的HTML
、Javascript
、CSS
以及各类静态文件(图片、字体等),让开发过程更加高效。对于不一样类型的资源,webpack
有对应的模块加载器。webpack
模块打包器会分析模块间的依赖关系,最后 生成了优化且合并后的静态资源CommonJS
是服务器端模块的规范,Node.js
采用了这个规范。CommonJS
规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操做。AMD
规范则是非同步加载模块,容许指定回调函数AMD
推荐的风格经过返回一个对象作为模块对象,CommonJS
的风格经过对module.exports
或exports
的属性赋值来达到暴露模块对象的目的sql
注入原理
SQL
命令插入到Web
表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令总的来讲有如下几点
"-"
进行转换等SQL
或者直接使用存储过程进行数据查询存取hash
掉密码和敏感的信息XSS原理及防范
Xss(cross-site scripting)
攻击指的是攻击者往Web
页面里插入恶意html
标签或者javascript
代码。好比:攻击者在论坛中放一个看似安全的连接,骗取用户点击后,窃取cookie
中的用户私密信息;或者攻击者在论坛中加一个恶意表单,当用户提交表单的时候,却把信息传送到攻击者的服务器中,而不是用户本来觉得的信任站点XSS防范方法
”<”,”>”,”;”,”’”
等字符作过滤;其次任何内容写到页面以前都必须加以encode,避免不当心把html tag
弄出来。这一个层面作好,至少能够堵住超过一半的XSS 攻击XSS与CSRF有什么区别吗?
XSS
是获取信息,不须要提早知道其余用户页面的代码和数据包。CSRF
是代替用户完成指定的动做,须要知道其余用户页面的代码和数据包。要完成一次CSRF
攻击,受害者必须依次完成两个步骤
登陆受信任网站A
,并在本地生成Cookie
在不登出A
的状况下,访问危险网站B
CSRF的防护
CSRF
方式方法不少样,但总的思想都是一致的,就是在客户端页面增长伪随机数工厂模式:
new
关键字构造函数模式
this
对象;Iframe
把真正的银行登陆页面嵌到他的页面上,当你使用真实的用户名,密码登陆时,他的页面就能够经过Javascript
读取到你的表单中input
中的内容,这样用户名,密码就轻松到手了。offsetWidth/offsetHeight
返回值包含content + padding + border,效果与e.getBoundingClientRect()相同clientWidth/clientHeight
返回值只包含content + padding,若是有滚动条,也不包含滚动条scrollWidth/scrollHeight
返回值包含content + padding + 溢出内容的尺寸var obj = {};
var obj = new Object();
var obj = Object.create(Object.prototype);
png24
位的图片在iE6浏览器上出现背景,解决方案是作成PNG8
margin
和padding
不一样。解决方案是加一个全局的*{margin:0;padding:0;}
来统一,,可是全局效率很低,通常是以下这样解决:body,ul,li,ol,dl,dt,dd,form,input,h1,h2,h3,h4,h5,h6,p{ margin:0; padding:0; }
IE
下,event
对象有x
,y
属性,可是没有pageX
,pageY
属性Firefox
下,event
对象有pageX
,pageY
属性,可是没有x,y
属性.依照 Promise/A+
的定义,Promise
有四种状态:
pending:
初始状态, 非 fulfilled
或 rejected.
fulfilled:
成功的操做.
rejected:
失败的操做.
settled: Promise
已被fulfilled
或rejected
,且不是pending
另外, fulfilled
与 rejected
一块儿合称 settled
Promise
对象用来进行延迟(deferred
) 和异步(asynchronous
) 计算
Promise 的构造函数
Promise
,最基本的用法以下:var promise = new Promise(function(resolve, reject) { if (...) { // succeed resolve(result); } else { // fails reject(Error(errMessage)); } });
Promise
实例拥有 then
方法(具备 then
方法的对象,一般被称为thenable
)。它的使用方法以下:promise.then(onFulfilled, onRejected)
fulfilled
的时候被调用,一个在rejected
的时候被调用,接收参数就是 future
,onFulfilled
对应resolve
, onRejected
对应 reject
jquery
源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,而后经过传入window
对象参数,能够使window
对象做为局部变量使用,好处是当jquery
中访问window
对象的时候,就不用将做用域链退回到顶层做用域了,从而能够更快的访问window对象。一样,传入undefined
参数,能够缩短查找undefined
时的做用域链jquery
将一些原型属性和方法封装在了jquery.prototype
中,为了缩短名称,又赋值给了jquery.fn
,这是很形象的写法jQuery
将其保存为局部变量以提升访问速度jquery
实现的链式调用能够节约代码,所返回的都是同一个对象,能够提升代码效率Vue.js
一个用于建立 web
交互界面的库,是一个精简的 MVVM
。它经过双向数据绑定把 View
层和 Model
层链接了起来。实际的 DOM
封装和输出格式都被抽象为了Directives
和 Filters
AngularJS
是一个比较完善的前端MVVM
框架,包含模板,数据双向绑定,路由,模块化,服务,依赖注入等全部功能,模板功能强大丰富,自带了丰富的 Angular
指令
react
React
仅仅是 VIEW
层是facebook
公司。推出的一个用于构建UI
的一个库,可以实现服务器端的渲染。用了virtual dom
,因此性能很好。
特色:
Javascript
运行环境Chrome V8
引擎进行代码解释I/O
优势:
缺点:
核CPU
,不能充分利用CPU
CommonJS
是服务器端模块的规范,Node.js
采用了这个规范。CommonJS
规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操做。AMD
规范则是非同步加载模块,容许指定回调函数
AMD
推荐的风格经过返回一个对象作为模块对象,CommonJS
的风格经过对module.exports
或exports
的属性赋值来达到暴露模块对象的目的
es6模块 commonjs amd cmd
CommonJS
的规范中,每一个 JavaScript
文件就是一个独立的模块上下文(module context
),在这个上下文中默认建立的属性都是私有的。也就是说,在一个文件定义的变量(还包括函数和类),都是私有的,对其余文件是不可见的。CommonJS
是同步加载模块,在浏览器中会出现堵塞状况,因此不适用AMD
异步,须要定义回调define
方式es6
一个模块就是一个独立的文件,该文件内部的全部变量,外部没法获取。若是你但愿外部可以读取模块内部的某个变量,就必须使用export
关键字输出该变量es6
还能够导出类、方法,自动适用严格模式setTimeout
的第一个参数使用字符串而非函数的话,会引起内存泄漏cookie
session
url
重写input
ip
地址Undefined
、Null
、Boolean
、Number
、String
Object
是 JavaScript
中全部对象的父对象Object
、Array
、Boolean
、Number
和 String
Function
、Arguments
、Math
、Date
、RegExp
、Error
===/!==
来比较true/false
或者数值new Array
这种形式Switch
语句必须带有default
分支If
语句必须使用大括号for-in
循环中的变量 应该使用var
关键字明确限定做用域,从而避免做用域污Undefined
,Null
,Boolean
,Numbe
r、String
)stack
)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,因此放入栈中存储;heap
)中的对象,占据空间大、大小不固定,若是存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其
javascript
建立对象简单的说,无非就是使用内置对象或各类自定义对象,固然还能够用JSON
;但写法有不少种,也能混合使用
person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
function
来模拟无参的构造函数function Person(){} var person=new Person();//定义一个function,若是使用new"实例化",该function能够看做是一个Class person.name="Mark"; person.age="25"; person.work=function(){ alert(person.name+" hello..."); } person.work();
function
来模拟参构造函数来实现(用this
关键字定义构造的上下文属性)function Pet(name,age,hobby){ this.name=name;//this做用域:当前对象 this.age=age; this.hobby=hobby; this.eat=function(){ alert("我叫"+this.name+",我喜欢"+this.hobby+",是个程序员"); } } var maidou =new Pet("麦兜",25,"coding");//实例化、建立对象 maidou.eat();//调用eat方法
var wcDog =new Object(); wcDog.name="旺财"; wcDog.age=3; wcDog.work=function(){ alert("我是"+wcDog.name+",汪汪汪......"); } wcDog.work();
function Dog(){ } Dog.prototype.name="旺财"; Dog.prototype.eat=function(){ alert(this.name+"是个吃货"); } var wangcai =new Dog(); wangcai.eat();
function Car(name,price){ this.name=name; this.price=price; } Car.prototype.sell=function(){ alert("我是"+this.name+",我如今卖"+this.price+"万元"); } var camry =new Car("凯美瑞",27); camry.sell();
JS
代码并运行eval
,不安全,很是耗性能(2
次,一次解析成js
语句,一次执行)JSON
字符串转换为JSON对象的时候能够用eval,var obj =eval('('+ str +')')
undefined
表示不存在这个值。
undefined
:是一个表示"无"的原始值或者说表示"缺乏值",就是此处应该有一个值,可是尚未定义。当尝试读取时会返回 undefined
例如变量被声明了,但没有赋值时,就等于undefined
null
表示一个对象被定义了,值为“空值”
null
: 是一个对象(空对象, 没有任何属性和方法)
例如做为函数的参数,表示该函数的参数不是对象;
在验证null
时,必定要使用 ===
,由于 ==
没法分别null
和 undefined
[1, NaN, NaN]
由于 parseInt
须要两个参数 (val, radix)
,其中radix
表示解析时用的基数。map
传了 3
个(element, index, array)
,对应的 radix
不合法致使解析失败。use strict
是一种ECMAscript 5
添加的(严格)运行模式,这种模式使得 Javascript 在更严格的条件下运行,使JS
编码更加规范化的模式,消除Javascript
语法的一些不合理、不严谨之处,减小一些怪异行为JSON(JavaScript Object Notation)
是一种轻量级的数据交换格式
它是基于JavaScript
的一个子集。数据格式简单, 易于读写, 占用带宽小
JSON
字符串转换为JSON对象:
var obj =eval('('+ str +')'); var obj = str.parseJSON(); var obj = JSON.parse(str);
JSON
对象转换为JSON字符串:var last=obj.toJSONString(); var last=JSON.stringify(obj);
defer
和async
、动态建立DOM
方式(用得最多)、按需异步载入js
defer
并行加载js
文件,会按照页面上script
标签的顺序执行async
并行加载js
文件,下载完成当即执行,不会按照页面上script
标签的顺序执行with
语句this
指向全局对象attribute
是dom
元素在文档中做为html
标签拥有的属性;property
就是dom
元素在js
中做为对象拥有的属性。html
的标准属性来讲,attribute
和property
是同步的,是会自动更新的JavaScript
提供了简单的字符串插值功能)for-of
(用来遍历数据—例如数组中的值。)arguments
对象可被不定参数和默认参数完美代替。ES6
将promise
对象归入规范,提供了原生的Promise
对象。let
和const
命令,用来声明变量。let
命令实际上就增长了块级做用域。module
模块的概念OOP
基础的人更快上手js
,至少是一个官方的实现了js
的人来讲,这个东西没啥大影响;一个Object.creat()
搞定继承,比class
简洁清晰的多instanceof
方法
instanceof
运算符是用来测试一个对象是否在其原型链原型构造函数的属性var arr = []; arr instanceof Array; // true
constructor
方法
constructor
属性返回对建立此对象的数组函数的引用,就是返回对象相对应的构造函数var arr = []; arr.constructor == Array; //true
jQuery
正在使用的Object.prototype.toString.call(value) == '[object Array]' // 利用这个方法,能够写一个返回数据类型的方法 var isType = function (obj) { return Object.prototype.toString.call(obj).slice(8,-1); }
ES5
新增方法isArray()
var a = new Array(123); var b = new Date(); console.log(Array.isArray(a)); //true console.log(Array.isArray(b)); //false
let
命令不存在变量提高,若是在let
前使用,会致使报错let
和const
命令,就会造成封闭做用域forEach
方法,是最基本的方法,就是遍历与循环,默认有3个传参:分别是遍历的数组内容item
、数组索引index
、和当前遍历数组Array
map
方法,基本用法与forEach
一致,可是不一样的,它会返回一个新的数组,因此在callback须要有return
值,若是没有,会返回undefined
this
对象,就是定义时所在的对象,而不是使用时所在的对象new
命令,不然会抛出一个错误arguments
对象,该对象在函数体内不存在。若是要用,能够用Rest
参数代替yield
命令,所以箭头函数不能用做Generator
函数this的指向在函数定义的时候是肯定不了的,只有函数执行的时候才能肯定this到底指向谁,实际上this的最终指向的是那个调用它的对象
《javascript语言精髓》中大概归纳了4种调用方式:
方法调用模式
函数调用模式
构造器调用模式
graph LR
A-->B
回调函数
事件监听(采用时间驱动模式,取决于某个事件是否发生):
发布/订阅(观察者模式)
Promise对象
Generator函数
async函数
RegExp
、JSON
、Ajax
、DOM
、BOM
、内存泄漏、跨域、异步装载、模板引擎、前端MVC
、路由、模块化、Canvas
、ECMAScript
CSS3
的动画的优势
CSS3
的动画作一些优化JavaScript
的动画正好弥补了这两个缺点,控制能力很强,能够单帧的控制、变换,同时写得好彻底能够兼容IE6
,而且功能强大。对于一些复杂控制的动画,使用javascript
会比较靠谱。而在实现一些小的交互动效的时候,就多考虑考虑CSS
吧一般咱们会用循环的方式来遍历数组。可是循环是 致使js 性能问题的缘由之一。通常咱们会采用下几种方式来进行数组的遍历
for in
循环
for
循环
forEach
forEach
回调中两个参数分别为 value
,index
forEach
没法遍历对象Firefox
和 chrome
支持forEach
没法使用 break
,continue
跳出循环,且使用 return
是跳过本次循环这两种方法应该很是常见且使用很频繁。但实际上,这两种方法都存在性能问题
在方式一中,for-in
须要分析出array
的每一个属性,这个操做性能开销很大。用在 key
已知的数组上是很是不划算的。因此尽可能不要用for-in
,除非你不清楚要处理哪些属性,例如 JSON
对象这样的状况
在方式2中,循环每进行一次,就要检查一下数组长度。读取属性(数组长度)要比读局部变量慢,尤为是当 array
里存放的都是 DOM
元素,由于每次读取都会扫描一遍页面上的选择器相关元素,速度会大大下降
gulp
是前端开发过程当中一种基于流的代码构建工具,是自动化项目的构建利器;它不只能对网站资源进行优化,并且在开发过程当中不少重复的任务可以使用正确的工具自动完成Node.js
流的威力,你能够快速构建项目并减小频繁的 IO
操做API
,掌握 gulp
绝不费力,构建工做尽在掌握:如同一系列流管道vue.js
则是采用数据劫持结合发布者-订阅者模式的方式,经过Object.defineProperty()
来劫持各个属性的setter
,getter
,在数据变更时发布消息给订阅者,触发相应的监听回调document
---> target
目标 ----> document
addEventListener
的第三个参数设置为true
和false
的区别已经很是清晰了
true
表示该元素在事件的“捕获阶段”(由外往内传递时)响应事件false
表示该元素在事件的“冒泡阶段”(由内向外传递时)响应事件let
var
const
const
申明基本数据类型时const a = 3
; a = 5
时 将会报错Value
项时, 将仍是正常使用var arr = [1,2,3,4,5,6,7,8,9,10]; arr.sort(function(){ return Math.random() - 0.5; }) console.log(arr);
这道题考察了如何在不卡住页面的状况下渲染数据,也就是说不能一次性将几万条都渲染出来,而应该一次渲染部分
DOM
,那么就能够经过requestAnimationFrame
来每16 ms
刷新一次
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <ul>控件</ul> <script> setTimeout(() => { // 插入十万条数据 const total = 100000 // 一次插入 20 条,若是以为性能很差就减小 const once = 20 // 渲染数据总共须要几回 const loopCount = total / once let countOfRender = 0 let ul = document.querySelector("ul"); function add() { // 优化性能,插入不会形成回流 const fragment = document.createDocumentFragment(); for (let i = 0; i < once; i++) { const li = document.createElement("li"); li.innerText = Math.floor(Math.random() * total); fragment.appendChild(li); } ul.appendChild(fragment); countOfRender += 1; loop(); } function loop() { if (countOfRender < loopCount) { window.requestAnimationFrame(add); } } loop(); }, 0); </script> </body> </html>
不使用第三方框架
var domList = document.getElementsByTagName(‘input’) var checkBoxList = []; var len = domList.length; //缓存到局部变量 while (len--) { //使用while的效率会比for循环更高 if (domList[len].type == ‘checkbox’) { checkBoxList.push(domList[len]); } }
建立新节点
createDocumentFragment() //建立一个DOM片断 createElement() //建立一个具体的元素 createTextNode() //建立一个文本节点
添加、移除、替换、插入
appendChild() //添加 removeChild() //移除 replaceChild() //替换 insertBefore() //插入
查找
getElementsByTagName() //经过标签名称 getElementsByName() //经过元素的Name属性的值 getElementById() //经过元素Id,惟一性
正则表达式构造函数
var reg=new RegExp(“xxx”)
与正则表达字面量var reg=//
有什么不一样?匹配邮箱的正则表达式?
RegExp()
构造函数的时候,不只须要转义引号(即\
”表示”),而且还须要双反斜杠(即\\
表示一个\
)。使用正则表达字面量的效率更高邮箱的正则匹配:
var regMail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/;
caller
是返回一个对函数的引用,该函数调用了当前函数;callee
是返回正在被执行的function
函数,也就是所指定的function
对象的正文那么问题来了?若是一对兔子每个月生一对兔子;一对新生兔,从第二个月起就开始生兔子;假定每对兔子都是一雌一雄,试问一对兔子,第n个月能繁殖成多少对兔子?(使用
callee
完成)
var result=[]; function fn(n){ //典型的斐波那契数列 if(n==1){ return 1; }else if(n==2){ return 1; }else{ if(result[n]){ return result[n]; }else{ //argument.callee()表示fn() result[n]=arguments.callee(n-1)+arguments.callee(n-2); return result[n]; } } }
原生
JS
的window.onload
与Jquery
的$(document).ready(function(){})
有什么不一样?如何用原生JS实现Jq的ready
方法?
window.onload()
方法是必须等到页面内包括图片的全部元素加载完毕后才能执行。$(document).ready()
是DOM
结构绘制完毕后就执行,没必要等到加载完毕function ready(fn){ if(document.addEventListener) { //标准浏览器 document.addEventListener('DOMContentLoaded', function() { //注销事件, 避免反复触发 document.removeEventListener('DOMContentLoaded',arguments.callee, false); fn(); //执行函数 }, false); }else if(document.attachEvent) { //IE document.attachEvent('onreadystatechange', function() { if(document.readyState == 'complete') { document.detachEvent('onreadystatechange', arguments.callee); fn(); //函数执行 } }); } };
addEventListener()
是符合W3C规范的标准方法; attachEvent()
是IE低版本的非标准方法addEventListener()
支持事件冒泡和事件捕获; - 而attachEvent()
只支持事件冒泡addEventListener()
的第一个参数中,事件类型不须要添加on
; attachEvent()
须要添加'on'
addEventListener()
会按照事件绑定的顺序依次执行, attachEvent()
会按照事件绑定的顺序倒序执行var resultArr= []; var input = document.querySelectorAll('input'); for( var i = 0; i < input.length; i++ ) { if( input[i].type == 'checkbox' ) { resultArr.push( input[i] ); } } //resultArr即中获取到了页面中的全部checkbox
方法一
push
进数组Array.prototype.distinct = function(){ var arr = this, result = [], i, j, len = arr.length; for(i = 0; i < len; i++){ for(j = i + 1; j < len; j++){ if(arr[i] === arr[j]){ j = ++i; } } result.push(arr[i]); } return result; } var arra = [1,2,3,4,4,1,1,2,1,1,1]; arra.distinct(); //返回[3,4,2,1]
方法二:利用splice直接在原数组进行操做
Array.prototype.distinct = function (){ var arr = this, i, j, len = arr.length; for(i = 0; i < len; i++){ for(j = i + 1; j < len; j++){ if(arr[i] == arr[j]){ arr.splice(j,1); len--; j--; } } } return arr; }; var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,]; var b = a.distinct(); console.log(b.toString()); //1,2,3,4,5,6,56
方法三:利用对象的属性不能相同的特色进行去重
Array.prototype.distinct = function (){ var arr = this, i, obj = {}, result = [], len = arr.length; for(i = 0; i< arr.length; i++){ if(!obj[arr[i]]){ //若是能查找到,证实数组元素重复了 obj[arr[i]] = 1; result.push(arr[i]); } } return result; }; var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,]; var b = a.distinct(); console.log(b.toString()); //1,2,3,4,5,6,56
方法四:数组递归去重
Array.prototype.distinct = function (){ var arr = this, len = arr.length; arr.sort(function(a,b){ //对数组进行排序才能方便比较 return a - b; }) function loop(index){ if(index >= 1){ if(arr[index] === arr[index-1]){ arr.splice(index,1); } loop(index - 1); //递归loop函数进行去重 } } loop(len-1); return arr; }; var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,56,45,56]; var b = a.distinct(); console.log(b.toString()); //1,2,3,4,5,6,45,56
方法五:利用indexOf以及forEach
Array.prototype.distinct = function (){ var arr = this, result = [], len = arr.length; arr.forEach(function(v, i ,arr){ //这里利用map,filter方法也能够实现 var bool = arr.indexOf(v,i+1); //从传入参数的下一个索引值开始寻找是否存在重复 if(bool === -1){ result.push(v); } }) return result; }; var a = [1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,2,3,3,2,2,1,23,1,23,2,3,2,3,2,3]; var b = a.distinct(); console.log(b.toString()); //1,23,2,3
方法六:利用ES6的set
Set
数据结构,它相似于数组,其成员的值都是惟一的。Array.from
将Set
结构转换成数组function dedupe(array){ return Array.from(new Set(array)); } dedupe([1,1,2,3]) //[1,2,3]
拓展运算符(
...
)内部使用for...of
循环
let arr = [1,2,3,3]; let resultarr = [...new Set(arr)]; console.log(resultarr); //[1,2,3]
mousedown
, mousemove
, mouseup
事件mousedown
事件触发后,开始拖拽mousemove
时,须要经过event.clientX
和clientY
获取拖拽位置,并实时更新位置mouseup
时,拖拽结束全局变量
Infinity
表明正的无穷大的数值。NaN
指示某个值是否是数字值。undefined
指示未定义的值。全局函数
decodeURI()
解码某个编码的 URI
。decodeURIComponent()
解码一个编码的 URI
组件。encodeURIComponent()
把字符串编码为 URI
组件。escape()
对字符串进行编码。eval()
计算 JavaScript
字符串,并把它做为脚本代码来执行。isFinite()
检查某个值是否为有穷大的数。isNaN()
检查某个值是不是数字。Number()
把对象的值转换为数字。parseFloat()
解析一个字符串并返回一个浮点数。parseInt()
解析一个字符串并返回一个整数。String()
把对象的值转换为字符串。unescape()
对由escape()
编码的字符串进行解码定时器思路
var e = document.getElementById('e') var flag = true; var left = 0; setInterval(() => { left == 0 ? flag = true : left == 100 ? flag = false : '' flag ? e.style.left = ` ${left++}px` : e.style.left = ` ${left--}px` }, 1000 / 60)
requestAnimationFrame
//兼容性处理 window.requestAnimFrame = (function(){ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback){ window.setTimeout(callback, 1000 / 60); }; })(); var e = document.getElementById("e"); var flag = true; var left = 0; function render() { left == 0 ? flag = true : left == 100 ? flag = false : ''; flag ? e.style.left = ` ${left++}px` : e.style.left = ` ${left--}px`; } (function animloop() { render(); requestAnimFrame(animloop); })();
使用css实现一个持续的动画效果
animation:mymove 5s infinite;
@keyframes mymove { from {top:0px;} to {top:200px;} }
animation-name
keyframe
名称。animation-duration
animation-timing-function
animation-delay
animation-iteration-count
animation-direction
规定是否应该轮流反向播放动画function sleep (time) { return new Promise((resolve) => setTimeout(resolve, time)); }
obj={
a:1, b:2 } obj2={ a:1, b:2 } obj3={ a:1, b:'2' }
能够转换为字符串来判断
JSON.stringify(obj)==JSON.stringify(obj2);//true JSON.stringify(obj)==JSON.stringify(obj3);//false
DNS
查询CDN
DOM
元素数量DOM
操做JavaScript
和 CSS
JavaScript
、 CSS
、字体、图片等CSS Sprite
iconfont
iframe
使用src
为空link
中浏览器缓存分为强缓存和协商缓存。当客户端请求某个资源时,获取缓存的流程以下
http header
判断它是否命中强缓存,若是命中,则直接从本地获取缓存资源,不会发请求到服务器;request header
验证这个资源是否命中协商缓存,称为http
再验证,若是命中,服务器将请求返回,但不返回资源,而是告诉客户端直接从缓存中获取,客户端收到返回后就会从缓存中获取资源;ctrl+f5
强制刷新网页时,直接从服务器加载,跳过强缓存和协商缓存;f5
刷新网页时,跳过强缓存,可是会检查协商缓存;强缓存
Expires
(该字段是 http1.0
时的规范,值为一个绝对时间的 GMT
格式的时间字符串,表明缓存资源的过时时间)Cache-Control:max-age
(该字段是 http1.1
的规范,强缓存利用其 max-age
值来判断缓存资源的最大生命周期,它的值单位为秒)协商缓存
Last-Modified
(值为资源最后更新时间,随服务器response返回)If-Modified-Since
(经过比较两个时间来判断资源在两次请求期间是否有过修改,若是没有修改,则命中协商缓存)ETag
(表示资源内容的惟一标识,随服务器response
返回)If-None-Match
(服务器经过比较请求头部的If-None-Match
与当前资源的ETag
是否一致来判断资源是否在两次请求之间有过修改,若是没有修改,则命中协商缓存)因为
http
存在一个明显的弊端(消息只能有客户端推送到服务器端,而服务器端不能主动推送到客户端),致使若是服务器若是有连续的变化,这时只能使用轮询,而轮询效率太低,并不适合。因而WebSocket
被发明出来
相比与
http
具备如下有点
ws
,加密后是 wss
;ws
客户端、服务端进行数据交换时,协议控制的数据包头部较小。在不包含头部的状况下,服务端到客户端的包头只有2~10
字节(取决于数据包长度),客户端到服务端的的话,须要加上额外的4字节的掩码。而HTTP
协议每次通讯都须要携带完整的头部;实现比较简单,服务端库如
socket.io
、ws
,能够很好的帮助咱们入门。而客户端也只须要参照api
实现便可
最最重要的一点,
electron
其实是一个套了Chrome
的node
程序
因此应该是从两个方面说开来
Chrome
(无各类兼容性问题);Node
(Node
能作的它也能作)浅拷贝
Object.assign
深拷贝
JSON.parse(JSON.stringify(object))
来解决let a = { age: 1, jobs: { first: 'FE' } } let b = JSON.parse(JSON.stringify(a)) a.jobs.first = 'native' console.log(b.jobs.first) // FE
该方法也是有局限性的
undefined
防抖
在滚动事件中须要作个复杂计算或者实现一个按钮的防二次点击操做。能够经过函数防抖动来实现
// 使用 underscore 的源码来解释防抖动 /** * underscore 防抖函数,返回函数连续调用时,空闲时间必须大于或等于 wait,func 才会执行 * * @param {function} func 回调函数 * @param {number} wait 表示时间窗口的间隔 * @param {boolean} immediate 设置为ture时,是否当即调用函数 * @return {function} 返回客户调用函数 */ _.debounce = function(func, wait, immediate) { var timeout, args, context, timestamp, result; var later = function() { // 如今和上一次时间戳比较 var last = _.now() - timestamp; // 若是当前间隔时间少于设定时间且大于0就从新设置定时器 if (last < wait && last >= 0) { timeout = setTimeout(later, wait - last); } else { // 不然的话就是时间到了执行回调函数 timeout = null; if (!immediate) { result = func.apply(context, args); if (!timeout) context = args = null; } } }; return function() { context = this; args = arguments; // 得到时间戳 timestamp = _.now(); // 若是定时器不存在且当即执行函数 var callNow = immediate && !timeout; // 若是定时器不存在就建立一个 if (!timeout) timeout = setTimeout(later, wait); if (callNow) { // 若是须要当即执行函数的话 经过 apply 执行 result = func.apply(context, args); context = args = null; } return result; }; };
总体函数实现
对于按钮防点击来讲的实现
节流
防抖动和节流本质是不同的。防抖动是将屡次执行变为最后一次执行,节流是将屡次执行变成每隔一段时间执行
/**
* underscore 节流函数,返回函数连续调用时,func 执行频率限定为 次 / wait * * @param {function} func 回调函数 * @param {number} wait 表示时间窗口的间隔 * @param {object} options 若是想忽略开始函数的的调用,传入{leading: false}。 * 若是想忽略结尾函数的调用,传入{trailing: false} * 二者不能共存,不然函数不能执行 * @return {function} 返回客户调用函数 */ _.throttle = function(func, wait, options) { var context, args, result; var timeout = null; // 以前的时间戳 var previous = 0; // 若是 options 没传则设为空对象 if (!options) options = {}; // 定时器回调函数 var later = function() { // 若是设置了 leading,就将 previous 设为 0 // 用于下面函数的第一个 if 判断 previous = options.leading === false ? 0 : _.now(); // 置空一是为了防止内存泄漏,二是为了下面的定时器判断 timeout = null; result = func.apply(context, args); if (!timeout) context = args = null; }; return function() { // 得到当前时间戳 var now = _.now(); // 首次进入前者确定为 true // 若是须要第一次不执行函数 // 就将上次时间戳设为当前的 // 这样在接下来计算 remaining 的值时会大于0 if (!previous && options.leading === false) previous = now; // 计算剩余时间 var remaining = wait - (now - previous); context = this; args = arguments; // 若是当前调用已经大于上次调用时间 + wait // 或者用户手动调了时间 // 若是设置了 trailing,只会进入这个条件 // 若是没有设置 leading,那么第一次会进入这个条件 // 还有一点,你可能会以为开启了定时器那么应该不会进入这个 if 条件了 // 其实仍是会进入的,由于定时器的延时 // 并非准确的时间,极可能你设置了2秒 // 可是他须要2.2秒才触发,这时候就会进入这个条件 if (remaining <= 0 || remaining > wait) { // 若是存在定时器就清理掉不然会调用二次回调 if (timeout) { clearTimeout(timeout); timeout = null; } previous = now; result = func.apply(context, args); if (!timeout) context = args = null; } else if (!timeout && options.trailing !== false) { // 判断是否设置了定时器和 trailing // 没有的话就开启一个定时器 // 而且不能不能同时设置 leading 和 trailing timeout = setTimeout(later, remaining); } return result; }; };
当执行 JS 代码时,会生成执行环境,只要代码不是写在函数中的,就是在全局执行环境中,函数中的代码会产生函数执行环境,只此两种执行环境
var
b() // call b console.log(a) // undefined var a = 'Hello world' function b() { console.log('call b') }
::: tip 变量提高
这是由于函数和变量提高的缘由。一般提高的解释是说将声明的代码移动到了顶部,这其实没有什么错误,便于你们理解。可是更准确的解释应该是:在生成执行环境时,会有两个阶段。第一个阶段是建立的阶段,JS 解释器会找出须要提高的变量和函数,而且给他们提早在内存中开辟好空间,函数的话会将整个函数存入内存中,变量只声明而且赋值为 undefined
,因此在第二个阶段,也就是代码执行阶段,咱们能够直接提早使用
:::
在提高的过程当中,相同的函数会覆盖上一个函数,而且函数优先于变量提高
b() // call b second function b() { console.log('call b fist') } function b() { console.log('call b second') } var b = 'Hello world'
复制代码
var
会产生不少错误,因此在ES6
中引入了let
。let
不能在声明前使用,可是这并非常说的let
不会提高,let
提高了,在第一阶段内存也已经为他开辟好了空间,可是由于这个声明的特性致使了并不能在声明前使用
(function( window, undefined ) { //用一个函数域包起来,就是所谓的沙箱 //在这里边var定义的变量,属于这个函数域内的局部变量,避免污染全局 //把当前沙箱须要的外部变量经过函数参数引入进来 //只要保证参数对内提供的接口的一致性,你还能够随意替换传进来的这个参数 window.jQuery = window.$ = jQuery; })( window );
(function(window, undefined) {})(window);
jQuery
利用 JS
函数做用域的特性,采用当即调用表达式包裹了自身,解决命名空间和变量污染问题
window.jQuery = window.$ = jQuery;
在闭包当中将 jQuery 和 $ 绑定到 window 上,从而将 jQuery 和 $ 暴露为全局变量
jQuery.fn
的 init
方法返回的 this
指的是什么对象$.fn.extend()
和 $.extend()
是 jQuery
为扩展插件提拱了两个方法$.extend(object)
; // 为jQuery添加“静态方法”(工具方法)$.extend({ min: function(a, b) { return a < b ? a : b; }, max: function(a, b) { return a > b ? a : b; } }); $.min(2,3); // 2 $.max(4,5); // 5
var settings = {validate:false, limit:5}; var options = {validate:true, name:"bar"}; $.extend(settings, options); // 注意:不支持第一个参数传 false // settings == {validate:true, limit:5, name:"bar"}
$.fn.extend(json)
; // 为jQuery添加“成员函数”(实例方法)$.fn.extend({ alertValue: function() { $(this).click(function(){ alert($(this).val()); }); } }); $("#email").alertValue();
浅拷贝(只复制一份原始对象的引用)var newObject = $.extend({}, oldObject);
深拷贝(对原始对象属性所引用的对象进行进行递归拷贝)var newObject = $.extend(true, {}, oldObject);
queue()/dequeue()/clearQueue()
三个方法组成。animate()
,ajax
,其余要按时间顺序执行的事件中var func1 = function(){alert('事件1');} var func2 = function(){alert('事件2');} var func3 = function(){alert('事件3');} var func4 = function(){alert('事件4');} // 入栈队列事件 $('#box').queue("queue1", func1); // push func1 to queue1 $('#box').queue("queue1", func2); // push func2 to queue1 // 替换队列事件 $('#box').queue("queue1", []); // delete queue1 with empty array $('#box').queue("queue1", [func3, func4]); // replace queue1 // 获取队列事件(返回一个函数数组) $('#box').queue("queue1"); // [func3(), func4()] // 出栈队列事件并执行 $('#box').dequeue("queue1"); // return func3 and do func3 $('#box').dequeue("queue1"); // return func4 and do func4 // 清空整个队列 $('#box').clearQueue("queue1"); // delete queue1 with clearQueue
bind
直接绑定在目标元素上live
经过冒泡传播事件,默认document
上,支持动态数据delegate
更精确的小范围使用事件代理,性能优于 liveon
是最新的1.9
版本整合了以前的三种方式的新事件绑定机制 document.createEvent(type); // 建立事件 event.initEvent(eventType, canBubble, prevent); // 初始化事件 target.addEventListener('dataavailable', handler, false); // 监听事件 target.dispatchEvent(e); // 触发事件
fire
函数用于调用jQuery
自定义事件列表中的事件Sizzle
选择器采起 Right To Left
的匹配模式,先搜寻全部匹配标签,再判断它的父节点jQuery
经过 $(selecter).find(selecter);
和 Sizzle
选择器结合// 经过原生 JSON.stringify/JSON.parse 扩展 jQuery 实现 $.array2json = function(array) { return JSON.stringify(array); } $.json2array = function(array) { // $.parseJSON(array); // 3.0 开始,已过期 return JSON.parse(array); } // 调用 var json = $.array2json(['a', 'b', 'c']); var array = $.json2array(json);
$("#btn").on("mouseover mouseout", func); $("#btn").on({ mouseover: func1, mouseout: func2, click: func3 });
DOM
对象id
选择器代替class
选择器#id
选择器来继承on
绑定事件jQuery
的内部函数data()
来存储数据jQuery
JS
原生 setTimeout
方法$('.tab').stop().slideUp();
$.widget()
传递组件名称和一个原型对象来完成$.widget("ns.widgetName", [baseWidget], widgetPrototype);
jQuery
是 JS
库,兼容各类PC浏览器,主要用做更方便地处理 DOM
、事件、动画、AJAX
jQuery UI
是创建在 jQuery
库上的一组用户界面交互、特效、小部件及主题
jQuery Mobile
以 jQuery
为基础,用于建立“移动Web应用”的框架
jQuery
主要目标是PC
的网页中,兼容所有主流浏览器。在移动设备方面,单独推出 `jQuery MobileZepto
从一开始就定位移动设备,相对更轻量级。它的
API 基本兼容
jQuery`,但对PC浏览器兼容不理想JQuery
对象才能使用 JQuery
方法JQuery
对象是一个数组对象
Bootstrap
是一个用于快速开发Web
应用程序和网站的前端框架。Bootstrap
是基于HTML
、CSS
、JAVASCRIPT
的
Bootstrap
具备移动设备优先、浏览器支持良好、容易上手、响应式设计等优势,因此Bootstrap
被普遍应用Bootstrap
时,须要使用 HTML5
文档类型(Doctype
)。<!DOCTYPE html>
Bootstrap
使用了一些 HTML5
元素和 CSS
属性,若是在 Bootstrap
建立的网页开头不使用 HTML5
的文档类型(Doctype
),可能会面临一些浏览器显示不一致的问题,甚至可能面临一些特定情境下的不一致,以至于代码不能经过 W3C
标准的验证
Bootstrap
包含了一个响应式的、移动设备优先的、不固定的网格系统,能够随着设备或视口大小的增长而适当地扩展到12
列。它包含了用于简单的布局选项的预约义类,也包含了用于生成更多语义布局的功能强大的混合类
viewport
)尺寸的增长,系统会自动分为最多12
列。.container class
内,以便得到适当的对齐(alignment
)和内边距(padding
)。.row
和 .col-xs-4
,可用于快速建立网格布局。LESS
混合类可用于更多语义布局。padding
)来建立列内容之间的间隙。该内边距是经过 .rows
上的外边距(margin
)取负,表示第一列和最后一列的行偏移。.col-xs-4
<768px
):.col-xs-
>=768px
):.col-sm-
>=992px
):.col-md-
>=1200px
):.col-lg-
间隙宽度为
30px
(一个列的每边分别是15px
)
在元素两旁添加
<small>
,或者添加.small
的class
class="text-center"
设置居中文本class="text-right"
设置向右对齐文本class="text-left"
设置向左对齐文本增长
class="table-responsive"
(1)向父<form>
元素添加role="form"
;
(2)把标签和控件放在一个带有class="form-group"
的<div>
中,这是获取最佳间距所必需的;
(3)向全部的文本元素<input>
、<textarea>
、<select>
添加class="form-control"
(1)向父<form>
元素添加class="form-horizontal"
;
(2)把标签和控件放在一个带有class="form-group"
的<div>
中;
(3)向标签添加class="control-label"
。
增长
class="help-block"
的span
标签或p
标签。
.active
的class
disabled="disabled"
的属性.img-rounded
为图片添加圆角.img-circle
将图片变为圆形.img-thumbnail
缩略图功能.img-responsive
图片响应式 (将很好地扩展到父元素)(1)class="pull-left"
元素浮动到左边
(2)class="pull-right"
元素浮动到右边
(3)class="clearfix"
清除浮动
`class="sr-only"``
class="dropdown"
的<div>
中;class="btn dropdown-toggle" id="dropdownMenu1" data-toggle="dropdown"
class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1"
role="presentation"
。其中,下拉菜单的标题要添加class="dropdown-header"
,选项部分要添加tabindex="-1"
。class="btn-group"
的<div>
去包裹按钮组;class="btn-group-vertical"
可设置垂直按钮组。btn-group
的优先级高于btn-group-vertical
的优先级。在一个
.btn-group
中放置按钮和下拉菜单便可。
class="input-group"
中的<div>
中<div>
内,在class="input-group-addon"
的<span>
里面放置额外的内容;<span>
放在<input>
元素的前面或后面。class="nav nav-tabs"
的标签页导航,还有class="nav nav-pills"
的胶囊式标签页导航;class="navbar navbar-default" role="navigation"
;class="breadcrumb"
class="pagination"
class="pager"
class="label"
<span class="badge">26</span>
设置
class="jumbotron"
能够制做超大屏幕,该组件能够增长标题的大小并增长更多的外边距
UglifyJsPlugin
require.ensure
devtool
中的source-map
css
文件,单独打包css
计算文件hash等devtool
loader
loader
开启cache
如babel-loader
编写一个loader
loader
就是一个node
模块,它输出了一个函数。当某种资源须要用这个loader
转换时,这个函数会被调用。而且,这个函数能够经过提供给它的this
上下文访问Loader API
。reverse-txt-loader
// 定义 module.exports = function(src) { //src是原文件内容(abcde),下面对内容进行处理,这里是反转 var result = src.split('').reverse().join(''); //返回JavaScript源码,必须是String或者Buffer return `module.exports = '${result}'`; } //使用 { test: /\.txt$/, use: [ { './path/reverse-txt-loader' } ] },
// event(事件)工具集,来源:github.com/markyun markyun.Event = { // 视能力分别使用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; }
function isArray(arg) { if (typeof arg === 'object') { return Object.prototype.toString.call(arg) === '[object Array]'; } return false; }
var arr = [3, 1, 4, 6, 5, 7, 2]; function bubbleSort(arr) { for (var i = 0; i < arr.length - 1; i++) { for(var j = 0; j < arr.length - 1; j++) { if(arr[j + 1] < arr[j]) { var temp; temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } return arr; } console.log(bubbleSort(arr));
var arr = [3, 1, 4, 6, 5, 7, 2]; function quickSort(arr) { if(arr.length == 0) { return []; // 返回空数组 } var cIndex = Math.floor(arr.length / 2); var c = arr.splice(cIndex, 1); var l = []; var r = []; for (var i = 0; i < arr.length; i++) { if(arr[i] < c) { l.push(arr[i]); } else { r.push(arr[i]); } } return quickSort(l).concat(c, quickSort(r)); } console.log(quickSort(arr));
function GetBytes(str){ var len = str.length; var bytes = len; for(var i=0; i<len; i++){ if (str.charCodeAt(i) > 255) bytes++; } return bytes; } alert(GetBytes("你好,as"));
bind
的做用与call
和apply
相同,区别是call
和apply
是当即调用函数,而bind
是返回了一个函数,须要调用的时候再执行。bind
函数实现以下Function.prototype.bind = function(ctx) { var fn = this; return function() { fn.apply(ctx, arguments); }; };
能够对
JavaScript
中的5种主要的数据类型,包括Number
、String
、Object
、Array
、Boolean
)进行值复
// 方法一: Object.prototype.clone = function(){ var o = this.constructor === Array ? [] : {}; for(var e in this){ o[e] = typeof this[e] === "object" ? this[e].clone() : this[e]; } return o; } //方法二: /** * 克隆一个对象 * @param Obj * @returns */ function clone(Obj) { var buf; if (Obj instanceof Array) { buf = []; //建立一个空的数组 var i = Obj.length; while (i--) { buf[i] = clone(Obj[i]); } return buf; }else if (Obj instanceof Object){ buf = {}; //建立一个空对象 for (var k in Obj) { //为这个对象添加新的属性 buf[k] = clone(Obj[k]); } return buf; }else{ //普通变量直接赋值 return Obj; } }
�考察闭包
<ul id=”test”> <li>这是第一条</li> <li>这是第二条</li> <li>这是第三条</li> </ul>
// 方法一: var lis=document.getElementById('2223').getElementsByTagName('li'); for(var i=0;i<3;i++) { lis[i].index=i; lis[i].onclick=function(){ alert(this.index); } //方法二: var lis=document.getElementById('2223').getElementsByTagName('li'); for(var i=0;i<3;i++) { lis[i].index=i; lis[i].onclick=(function(a){ return function() { alert(a); } })(i); }
可行的方法一:
function log(msg) { console.log(msg); } log("hello world!") // hello world!
若是要传入多个参数呢?显然上面的方法不能知足要求,因此更好的方法是:
function log(){ console.log.apply(console, arguments); };
以
YYYY-MM-DD
的方式,好比今天是2014年9月26日,则输出2014-09-26
var d = new Date(); // 获取年,getFullYear()返回4位的数字 var year = d.getFullYear(); // 获取月,月份比较特殊,0是1月,11是12月 var month = d.getMonth() + 1; // 变成两位 month = month < 10 ? '0' + month : month; // 获取日 var day = d.getDate(); day = day < 10 ? '0' + day : day; alert(year + '-' + month + '-' + day);
var iArray = []; funtion getRandom(istart, iend){ var iChoice = istart - iend +1; return Math.floor(Math.random() * iChoice + istart; } for(var i=0; i<10; i++){ iArray.push(getRandom(10,100)); } iArray.sort();
有这样一个
UR
L:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e
,请写一段JS程序提取URL中的各个GET参数(参数名和参数个数不肯定),将其按key-value
形式返回到一个json
结构中,如{a:’1′, b:’2′, c:”, d:’xxx’, e:undefined}
function serilizeUrl(url) { var result = {}; url = url.split("?")[1]; var map = url.split("&"); for(var i = 0, len = map.length; i < len; i++) { result[map[i].split("=")[0]] = map[i].split("=")[1]; } return result; }
function
,清除字符串先后的空格使用自带接口
trim()
,考虑兼容性:
if (!String.prototype.trim) { String.prototype.trim = function() { return this.replace(/^\s+/, "").replace(/\s+$/,""); } } // test the function var str = " \t\n test string ".trim(); alert(str == "test string"); // alerts "true"
for(var i=0;i<10;i++){ (function(j){ setTimeout(function(){ console.log(j+1) },j*1000) })(i) }
多台服务器共同协做,不让其中某一台或几台超额工做,发挥服务器的最大做用
http
重定向负载均衡:调度者根据策略选择服务器以302响应请求,缺点只有第一次有效果,后续操做维持在该服务器ip
服务器中的一个(可监控性较弱)内容分发网络,基本思路是尽量避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。
定义:程序中己动态分配的堆内存因为某种缘由程序未释放或没法释放引起的各类问题。
js中可能出现的内存泄漏状况
结果:变慢,崩溃,延迟大等,缘由:
dom
清空时,还存在引用ie
中使用闭包避免策略
ES六、7
代码输入 ->babylon
进行解析 -> 获得AST
(抽象语法树)->plugin
用babel-traverse
对AST
树进行遍历转译 ->获得新的AST
树->用babel-generator
经过AST
树生成ES5
代码
三要素:
document.createEvent()
event.initEvent()
element.dispatchEvent()
// (en:自定义事件名称,fn:事件处理函数,addEvent:为DOM元素添加自定义事件,triggerEvent:触发自定义事件) window.onload = function(){ var demo = document.getElementById("demo"); demo.addEvent("test",function(){console.log("handler1")}); demo.addEvent("test",function(){console.log("handler2")}); demo.onclick = function(){ this.triggerEvent("test"); } } Element.prototype.addEvent = function(en,fn){ this.pools = this.pools || {}; if(en in this.pools){ this.pools[en].push(fn); }else{ this.pools[en] = []; this.pools[en].push(fn); } } Element.prototype.triggerEvent = function(en){ if(en in this.pools){ var fns = this.pools[en]; for(var i=0,il=fns.length;i<il;i++){ fns[i](); } }else{ return; } }
JS
根据URL
来操做DOM
元素,根据每一个页面须要的去服务端请求数据,返回数据后和模板进行组合table
)布局改成DIV+CSS
CSS
、如对IE6有效的)SEO
进行优化UI
设计,产品经理的沟通;globe.css
),编码模式(utf-8
) 等;CSS
跟HTML
分文件夹并行存放,命名都得统一(例如style.css
);JS
分文件夹存放 命名以该JS
功能为准的英文翻译。images.png png8
格式文件使用 - 尽可能整合在一块儿使用方便未来的管理目的:为了重用,提升开发效率和代码质量 注意:低耦合,单一职责,可复用性,可维护性 经常使用操做