title
、description
、keywords
:搜索對着三項的權重逐個減少,title值強調重點便可,重要關鍵詞出現不要超過2次,並且要靠前,不一樣頁面title
要有所不一樣;description
把頁面內容高度歸納,長度合適,不可過度堆砌關鍵詞,不一樣頁面description
有所不一樣;keywords
列舉出重要關鍵詞便可HTML
代碼,符合W3C規範:語義化代碼讓搜索引擎容易理解網頁HTML
代碼放在最前:搜索引擎抓取HTML
順序是從上到下,有的搜索引擎對抓取長度有限制,保證重要內容必定會被抓取js
輸出:爬蟲不會執行js獲取內容iframe
:搜索引擎不會抓取iframe
中的內容alt
alt
是<img>
的特有屬性,是圖片內容的等價描述,用於圖片沒法加載時顯示、讀屏器閱讀圖片。可提圖片高可訪問性,除了純裝飾圖片外都必須設置有意義的值,搜索引擎會重點分析。一、GET
方法javascript
二、POST
方法css
URL
指定的資源提交數據或附加新的數據三、PUT
方法html
POST
方法很像,也是想服務器提交數據。可是,它們之間有不一樣。PUT指定了資源在服務器上的位置,而POST
沒有四、HEAD
方法前端
五、DELETE
方法vue
六、OPTIONS
方法html5
URL
所支持的方法。若是請求成功,會有一個Allow
的頭包含相似「GET,POST」
這樣的信息七、TRACE
方法java
TRACE
方法被用於激發一個遠程的,應用層的請求消息迴路八、CONNECT
方法react
TCP/IP
通道URL
交給DNS
域名解析,找到真實IP
,向服務器發起請求;HTML、JS、CSS
、圖象等);HTML、JS、CSS
等)進行語法解析,創建相應的內部數據結構(如HTML
的DOM
);content
方面jquery
HTTP
請求:合併文件、CSS
精靈、inline Image
DNS
查詢:DNS
緩存、將資源分佈到恰當數量的主機名DOM
元素數量Server
方面webpack
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
的離線存儲是基於一個新建的.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
在線的狀況下,瀏覽器發現html
頭部有manifest
屬性,它會請求manifest
文件,若是是第一次訪問app
,那麼瀏覽器就會根據manifest文件的內容下載相應的資源而且進行離線存儲。若是已經訪問過app
而且資源已經離線存儲了,那麼瀏覽器就會使用離線的資源加載頁面,而後瀏覽器會對比新的manifest
文件與舊的manifes
t文件,若是文件沒有發生改變,就不作任何操做,若是文件改變了,那麼就會從新下載文件中的資源並進行離線存儲。
離線的狀況下,瀏覽器就直接使用離線存儲的資源。
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
實現 須要求一個點在不在圓上簡單算法、獲取鼠標座標等等概念:將多個小圖片拼接到一個圖片中。經過background-position
和元素尺寸調節須要顯示的背景圖案。
優勢:
HTTP
請求數,極大地提升頁面加載速度缺點:
聯繫:它們都能讓元素不可見
區別:
display:none
;會讓元素徹底從渲染樹中消失,渲染的時候不佔據任何空間;visibility: hidden
;不會讓元素從渲染樹消失,渲染師元素繼續佔據空間,只是內容不可見display: none
;是非繼承屬性,子孫節點消失因爲元素從渲染樹消失形成,經過修改子孫節點屬性沒法顯示;visibility: hidden;
是繼承屬性,子孫節點消失因爲繼承了hidden
,經過設置visibility: visible;
可讓子孫節點顯式display
一般會形成文檔重排。修改visibility
屬性只會形成本元素的重繪。display: none
;元素內容;會讀取visibility: hidden;
元素內容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
閉包就是可以讀取其餘函數內部變量的函數
閉包是指有權訪問另外一個函數做用域中變量的函數,建立閉包的最多見的方式就是在一個函數內建立另外一個函數,經過另外一個函數訪問這個函數的局部變量,利用閉包能夠突破做用鏈域
閉包的特性:
說說你對閉包的理解
使用閉包主要是爲了設計私有的方法和變量。閉包的優勢是能夠避免全局變量的污染,缺點是閉包會常駐內存,會增大內存使用量,使用不當很容易形成內存泄露。在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
暴露了與服務器交互的細節。jsonp
、 iframe
、window.name
、window.postMessage
、服務器上設置代理頁面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
的屬性賦值來達到暴露模塊對象的目的
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
命令,就會造成封閉做用域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
,在數據變更時發佈消息給訂閱者,觸發相應的監聽回調(function( window, undefined ) { //用一個函數域包起來,就是所謂的沙箱 //在這裏邊var定義的變量,屬於這個函數域內的局部變量,避免污染全局 //把當前沙箱須要的外部變量經過函數參數引入進來 //只要保證參數對內提供的接口的一致性,你還能夠隨意替換傳進來的這個參數 window.jQuery = window.$ = jQuery; })( window );
(function(window, undefined) {})(window);
jQuery
利用 JS
函數做用域的特性,採用當即調用表達式包裹了自身,解決命名空間和變量污染問題
window.jQuery = window.$ = jQuery;
在閉包當中將 jQuery 和 $ 綁定到 window 上,從而將 jQuery 和 $ 暴露爲全局變量
$.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); // 觸發事件
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
對象是一個數組對象// 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 - i - 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); }; };
網站重構:在不改變外部行爲的前提下,簡化結構、添加可讀性,而在網站前端保持一致的行爲。也就是說是在不改變UI的狀況下,對網站進行優化, 在擴展的同時保持一致的UI
對於傳統的網站來講重構一般是:
表格(table
)佈局改成DIV+CSS
使網站前端兼容於現代瀏覽器(針對於不合規範的CSS
、如對IE6有效的)
對於移動平臺的優化
針對於SEO
進行優化
前端是最貼近用戶的程序員,比後端、數據庫、產品經理、運營、安全都近
前端是最貼近用戶的程序員,前端的能力就是能讓產品從 90分進化到 100 分,甚至更好,
與團隊成員,UI
設計,產品經理的溝通;
作好的頁面結構,頁面重構和用戶體驗;
爲簡化用戶使用提供技術支持(交互部分)
爲多個瀏覽器兼容性提供支持
爲提升用戶瀏覽速度(瀏覽器性能)提供支持
爲跨平臺或者其餘基於webkit或其餘渲染引擎的應用提供支持
爲展現數據提供支持(數據接口)
先期團隊必須肯定好全局樣式(globe.css
),編碼模式(utf-8
) 等;
編寫習慣必須一致(例如都是採用繼承式的寫法,單樣式都寫成一行);
標註樣式編寫人,各模塊都及時標註(標註關鍵樣式調用的地方);
頁面進行標註(例如 頁面 模塊 開始和結束);
CSS
跟HTML
分文件夾並行存放,命名都得統一(例如style.css
);
JS
分文件夾存放 命名以該JS
功能爲準的英文翻譯。
圖片採用整合的 images.png png8
格式文件使用 - 儘可能整合在一塊兒使用方便未來的管理