面試問題答案綜合版javascript
在線預覽 http://blog.poetries.top/FE-Interview-Questionscss
title
、description
、keywords
:搜索對着三項的權重逐個減少,title
值強調重點便可,重要關鍵詞出現不要超過 2 次,並且要靠前,不一樣頁面title
要有所不一樣;description
把頁面內容高度歸納,長度合適,不可過度堆砌關鍵詞,不一樣頁面description
有所不一樣;keywords
列舉出重要關鍵詞便可HTML
代碼,符合 W3C 規範:語義化代碼讓搜索引擎容易理解網頁HTML
代碼放在最前:搜索引擎抓取HTML
順序是從上到下,有的搜索引擎對抓取長度有限制,保證重要內容必定會被抓取js
輸出:爬蟲不會執行 js 獲取內容iframe
:搜索引擎不會抓取iframe
中的內容alt
<img>
的title
和alt
有什麼區別alt
是<img>
的特有屬性,是圖片內容的等價描述,用於圖片沒法加載時顯示、讀屏器閱讀圖片。可提圖片高可訪問性,除了純裝飾圖片外都必須設置有意義的值,搜索引擎會重點分析。GET
方法html
POST
方法前端
URL
指定的資源提交數據或附加新的數據PUT
方法vue
POST
方法很像,也是想服務器提交數據。可是,它們之間有不一樣。PUT
指定了資源在服務器上的位置,而POST
沒有HEAD
方法html5
DELETE
方法java
OPTIONS
方法node
URL
所支持的方法。若是請求成功,會有一個Allow
的頭包含相似「GET,POST」
這樣的信息TRACE
方法react
TRACE
方法被用於激發一個遠程的,應用層的請求消息迴路CONNECT
方法jquery
TCP/IP
通道基礎版本
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> <div></div> <div></div> <div></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> <div></div> <div></div> <div></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> <div></div> </div> <div></div> <div></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> <div>固定寬度</div> <div>自適應寬度</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 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" 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>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 - 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); }; };
能夠對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
格式文件使用 - 儘可能整合在一塊兒使用方便未來的管理目的:爲了重用,提升開發效率和代碼質量 注意:低耦合,單一職責,可複用性,可維護性 經常使用操做