摘要:加上等于在頁面完全載入后再執(zhí)行,相當(dāng)于文檔載入后即執(zhí)行,不用等包括圖片在內(nèi)的資源下載完畢。對于請求,表示請求還沒有被處理,客戶端應(yīng)該向里的重新發(fā)起請求。
1.關(guān)于基礎(chǔ)css html js部分 1.1基本算法 1)快速排序
時(shí)間復(fù)雜度 nlogn
function quickSort(arr){ if (arr.length<=1){ return arr; } var pivotIndex = 0, pivort = arr.splice(pivortIndex, 1)[0]; var left = [], right = []; for (var i = 1, length = arr.length; i < length; i++) { if (arr[i] < pivort) { left.push(arr[i]); }else if (arr[i] > = pivort) { right.push(arr[i]); } } return quickSort(left).concat([pivort], quickSort(right)); }2) 二分查找算法
時(shí)間復(fù)雜度:logn(以2為底n的對數(shù))
二分查找的基本思想是將n個(gè)元素分成大致相等的兩部分,去a[n/2]與x做比較,如果x=a[n/2],則找到x,算法中止;如果xa[n/2],則只要在數(shù)組a的右半部搜索x. 時(shí)間復(fù)雜度無非就是while循環(huán)的次數(shù)! 總共有n個(gè)元素, 漸漸跟下去就是n,n/2,n/4,....n/2^k,其中k就是循環(huán)的次數(shù) 由于你n/2^k取整后>=1 即令n/2^k=1 可得k=log2n,(是以2為底,n的對數(shù)) 所以時(shí)間復(fù)雜度可以表示O()=O(logn)
function binarySearch (arr, value) { var low = 0, high = arr.length - 1, mid; while (low <= high) { mid = Math.floor((low + high)/2); if (arr[mid] == value) { return mid; }else if (arr[mid] < value) { low = mid +1; }else if (arr[mid] > value) { high = mid -1; }else { return -1; } } }3)單向鏈表反轉(zhuǎn)
依次將第2---N個(gè)節(jié)點(diǎn)逐次插入到第一個(gè)節(jié)點(diǎn)后,最后將第一個(gè)節(jié)點(diǎn)挪到新表的結(jié)尾
例子為單向鏈表,頭結(jié)點(diǎn)為空
時(shí)間復(fù)雜度:N
function reverse (list) { //空鏈表 if (list.head.next == null) { return list; } //非空鏈表 var p = list.head.next, q; while (p.next !== null) { q = p.next; p.next = q.next; q.next = list.head.next; list.head.next = q; } return list; }4)查找單向鏈表的倒數(shù)第K個(gè)節(jié)點(diǎn)
function searchK (list, k) { var head = list.head; if (head == null || k == 0) { return null; } //第一個(gè)節(jié)點(diǎn)先向前走K-1步 var firstNode = head; for (var i = 0; i < k-1; i++) { firstNode = firstNode.next; } //判斷鏈表長度是否有K長 if (i!== k-1) { return null; } //兩個(gè)節(jié)點(diǎn)同時(shí)走 var secondNode = head; while (firstNode.next !== null) { secondNode = secondNode.next; firstNode = firstNode.next; } return secondNode; }5)深度克隆
function clone (test) { if (Array.isArray(test)) { var arr = []; for (var i = 0, length = test.length; i < length; i++) { arr.push(clone(arr[i])); } }else if (typeOf test === "object") { var obj = {}; for (var j in test) { obj[j] = clone(test[j]); } return obj; }else { return test; } }6)數(shù)組去重
例如去重["1",1,2,2,NaN,NaN,null,undefined]
尤其注意1,"1"
NaN
function _isNaN (value) { return typeof value === "number" && isNaN(value); } function unique (arr) { var type = "", key = "", res = [], hash = {}; for(var i= 0,len=arr.length;i7)兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列
1.2 replace,match,search正則匹配是string的方法
https://segmentfault.com/a/11...str.replace(/ /g,"20%"); g表示全局匹配,不會匹配完第一個(gè)就不匹配了 i忽略大小寫 m多行匹配1.3 Rexg正則匹配test,exectest,返回一個(gè) Boolean 值,它指出在被查找的字符串中是否存在模式。 如果存在則返回 true,否則就返回 false。 exec,用正則表達(dá)式模式在字符串中運(yùn)行查找var str=" 12 er 45 ;; ";var rexg=/ /;rexg.exec(str); Array[1] 0: " " index: 0 input: " 12 er 45 ;; " length: 1 __proto__: Array[0]var str=" 12 er 45 ;; ";var rexg=/ /;rexg.exec(str); [" "]0: " "index: 0input: " 12 er 45 ;; "length: 1__proto__: Array[0] var str=" 12 er 45 ;; ";str.match(/ /g,"20%"); [" ", " ", " ", " ", " "] var str=" 12 er 45 ;; ";str.replace(/ /,"20%"); "20%12 er 45 ;; " var str=" 12 er 45 ;; ";str.match(/ /,"20%"); [" "] var str=" 12 er 45 ;; ";str.search(/ /,"20%"); 0 var str=" 12 er 45 ;; ";str.search(/ /g,"20%"); 0 var str=" 12 er 45 ;; ";var rexg=/ /;rexg.test(str); true1.4 閉包定義:
可以訪問外部函數(shù)作用于中變量的函數(shù)
被內(nèi)部函數(shù)引用的外部函數(shù)的變量保存在外部作用域中而不被回收
優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
變量私有化
減少全局變量污染
可以讓一個(gè)變量常駐內(nèi)存
缺點(diǎn):
內(nèi)存泄漏
閉包會攜帶包含它的函數(shù)的作用域,因此會比其他函數(shù)占用更多的內(nèi)存
1.5 js數(shù)組數(shù)組可以當(dāng)棧用:
arr.unshift(val)進(jìn)棧,依次向前插入 arr.pop()出棧 取得數(shù)組最后一項(xiàng),原數(shù)組改變減少最后一項(xiàng) 實(shí)現(xiàn)了先進(jìn)后出數(shù)組當(dāng)隊(duì)列或者正常數(shù)組用:
arr.push(val),順序添加 arr.shift(),拋出第一個(gè)值即arr[0],原數(shù)組改變減少第一項(xiàng)2.關(guān)于JS延遲加載JS延遲加載的方式: 1.位置,js放在
結(jié)束標(biāo)簽前 2.監(jiān)聽,window.onload后再添加script標(biāo)簽 3.屬性,為script標(biāo)簽添加屬性defer或async 4.ajax下載js腳本后eval()執(zhí)行 3.defer和async的比較
3.1 defer="defer",defer默認(rèn)false: 該屬性用來通知瀏覽器,這段腳本代碼將不會產(chǎn)生任何文檔內(nèi)容。 例如 JavaScript代碼中的document.write()方法將不會騎作用,瀏覽器遇到這樣的代碼將會忽略,并繼續(xù)執(zhí)行后面的代碼。 屬性只能是 defer,與屬性名相同。 在HTML語法格式下,也允許不定義屬性值,僅僅使用屬性名。 3.2 async="true/false",只寫async省略屬性值的情況下為true: 該屬性為html5中新增的屬性,它的作用是能夠異步地下載和執(zhí)行腳本,不因?yàn)榧虞d腳本而阻塞頁面的加載。 一旦下載完畢就會立刻執(zhí)行。 加上defer 等于在頁面完全載入后再執(zhí)行,相當(dāng)于文檔載入后即執(zhí)行,不用等包括圖片在內(nèi)的資源下載完畢。 async和defer一樣,都不會阻塞其他資源下載,所以不會影響頁面的加載, 但在async的情況下,js文檔一旦下載完畢就會立刻執(zhí)行,所以很有可能不是按照原本的順序來執(zhí)行,如果js有依賴性,就要注意了。 3.3 相同點(diǎn): 加載文件時(shí)不阻塞頁面渲染; 使用這兩個(gè)屬性的腳本中不能調(diào)用document.write方法; 允許不定義屬性值,僅僅使用屬性名; 3.4 不同點(diǎn): html的版本html4.0中定義了defer;html5.0中定義了async;這將造成由于瀏覽器版本的不同而對其支持的程度不同; 執(zhí)行時(shí)刻:每一個(gè)async屬性的腳本都在它下載結(jié)束之后立刻執(zhí)行,同時(shí)會在window的load事件之前執(zhí)行。 所以就有可能出現(xiàn)腳本執(zhí)行順序被打亂的情況; 每一個(gè)defer屬性的腳本都是在頁面解析完畢之后,按照原本的順序執(zhí)行,同時(shí)會在document的DOMContentLoaded之前執(zhí)行。 3.5 混合用 如果async為true,那么腳本在下載完成后異步執(zhí)行。 如果async為false,defer為true,那么腳本會在頁面解析完畢之后執(zhí)行。 如果async和defer都為false,那么腳本會在頁面解析中,停止頁面解析,立刻下載并且執(zhí)行。4.關(guān)于ajax
var xhr = new XMLHttpRequest(); IE new ActiveXObject("Microsoft.XMLHTTP");
1.xhr.open()
三個(gè)參數(shù): 1)請求方式,post/get 2)請求的URL 3)是否發(fā)送異步請求 true/false
注意: 只是啟動,并未發(fā)送請求,要調(diào)用send
2.xhr.send()
一個(gè)參數(shù):必須有 參數(shù)為http請求的主體 post請求一般傳入 get請求必須傳入null
發(fā)送后得到服務(wù)器的響應(yīng),響應(yīng)的數(shù)據(jù)會自動填充xhr的屬性
responseText,響應(yīng)主體 responseXML status,http狀態(tài)碼 statusText,狀態(tài)說明
3.xhr.readyState
如何判斷服務(wù)器響應(yīng)已到位,如何判斷響應(yīng)所處階段
xhr.readyState:0,1,2,3,4 4表示完成,收到全部響應(yīng)
4.xhr.status
((status >= 200 && status <300) || status = = = 304 ) 表示請求成功
5.xhr.onreadystatechange事件
readyState改變一次,onreadystatechange事件觸發(fā)一次
var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ try { if((xhr.status >= 200 && xhr.status <300) || xhr.status == 304){ console.log(xhr.responseText); }else{ console.log("erro:" + xhr.status); } }catch(ex){ //ontimeout處理 } } }; xhr.open("get","example.js",true);//異步 xhr.send(null);
6.對GET,POST請求參數(shù)的處理
GET
1) encodeURIComponent()對參數(shù)鍵和值進(jìn)行編碼,保證格式正確 2) 鍵=值對之間以 & 分隔
function addURLParam(url,name,value){ url + = (url.indexOf("?") = = -1 ? "?" : "&"); url + = encodeURIComponent(name) + "=" + encodeURIComponent(value); return url; }
POST
XMLHttpRequest 1級的實(shí)現(xiàn): 1)Content-Type的設(shè)置:xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 2)serialize()序列化數(shù)據(jù) var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ try { if((xhr.status >= 200 && xhr.status <300) || xhr.status == 304){ console.log(xhr.responseText); }else{ console.log("erro:" + xhr.status); } }catch(ex){ //ontimeout處理 } } }; xhr.open("post",url,true);//異步 xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); var form = document.getElementById("exampleID"); xhr.send(serialize(form));
XMLHttpRequest 2級 增加了FormData:不必明確頭部類型 var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ try { if((xhr.status >= 200 && xhr.status <300) || xhr.status == 304){ console.log(xhr.responseText); }else{ console.log("erro:" + xhr.status); } }catch(ex){ //ontimeout處理 } } }; xhr.open("post",url,true);//異步 var form = document.getElementById("exampleID"); xhr.send(new FormData(form));
7.XMLHttpRequest 2 級
xhr.timeout = 屬性值 xhr.ontimemout = function(){ console.log("超時(shí)未收到響應(yīng)"); }; 在規(guī)定時(shí)間內(nèi)瀏覽器未收到響應(yīng)就觸發(fā) ontimeout 事件5.關(guān)于web存儲
5.1 cookie,sessionStorage,localStorage區(qū)別?
sessionStorage,loalStorage統(tǒng)稱webStorage; Cookie的作用是與服務(wù)器進(jìn)行交互,作為HTTP規(guī)范的一部分而存在,而Web Storage僅僅是為了在本地“存儲”數(shù)據(jù)而生
(1)存儲大小:
cookie,4k; sessionStorage,localStorage,5M或更大;
(2)過期時(shí)間:
cookie,過期時(shí)間前一直有效,默認(rèn)cookie(沒有設(shè)置expires的cookie)失效時(shí)間直到關(guān)閉瀏覽器,設(shè)置方式 保留COOKIES一個(gè)小時(shí)------Response.Cookies("MyCookie").Expires = DateAdd("h", 1, Now()); sessionStorage關(guān)閉即刪除,只要同源的同窗口(或tab)中,刷新頁面或進(jìn)入同源的不同頁面,數(shù)據(jù)始終存在 loalStorage永不丟失
(3)服務(wù)器交互帶寬使用情況:
cookie放在請求頭發(fā)送給服務(wù)端,浪費(fèi)帶寬 sessionStorage,loalStorage無于服務(wù)端交互
(4)存儲位置:
cookie以鍵值對形式存儲在http請求的header中發(fā)送給服務(wù)端,同時(shí)從服務(wù)端獲得的cookie是 鍵=值分號隔開的形式存儲 sessionStorage,localStorage存儲在本地
(5)共享:
cookie受同源策略限制 sessionStorage同一窗口共享 localStorage受同源限制
(6)用法:
cookie需要自己封裝方法 * escape()函數(shù)是JS內(nèi)置函數(shù),編碼將字符串編碼為16進(jìn)制,unescape()解碼
1.添加一個(gè)cookie 2.獲取指定名稱的cookie值:getcookie(name) 該函數(shù)返回名稱為name的cookie值,如果不存在則返回空,其實(shí)現(xiàn)如下: 3.刪除指定名稱的cookie:deletecookie(name) 該函數(shù)可以刪除指定名稱的cookie,其實(shí)現(xiàn)如下:
cookie 的屬性:Domain(設(shè)置子域該域下才可訪問cookie) HttpOnly(設(shè)置后將不能用JS腳本操作cookie), Secure(設(shè)置后將只能通過HTTPS協(xié)議訪問), Expiress(過期時(shí)間,不設(shè)置默認(rèn)關(guān)閉瀏覽器cookie失效),目前已被max-age屬性所取代 max-age用秒來設(shè)置cookie的生命周期 Path(設(shè)置路徑的頁面才可訪問cookie)
sessionStorage,localStorage有接口:
setItem,getItem,removeItem,clear
例如清除所有的key/value sessionStorage.clear(); localStorage.clear(); sessionStorage.setItem("key", "value"); var value = sessionStorage.getItem("key"); sessionStorage.removeItem("key");5.關(guān)于http 5.1 狀態(tài)碼
200 OK - [GET]:服務(wù)器成功返回用戶請求的數(shù)據(jù),該操作是冪等的(Idempotent) 201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數(shù)據(jù)成功 202 Accepted - [*]:表示一個(gè)請求已經(jīng)進(jìn)入后臺排隊(duì)(異步任務(wù)) 204 NO CONTENT - [DELETE]:用戶刪除數(shù)據(jù)成功。 301,302,303 redirect:重定向; 301永久性重定向 增加SEO排名,說說 302臨時(shí)重定向, 303:對于POST請求,它表示請求已經(jīng)被處理,客戶端可以接著使用GET方法去請求Location里的URI。 307:對于POST請求,表示請求還沒有被處理,客戶端應(yīng)該向Location里的URI重新發(fā)起POST請求。 304not modified:未修改返回緩存的內(nèi)容不再請求新的;request If-None-Match 400:客戶端的URL輸入有問題,瀏覽器解析不出來 401:需要身份驗(yàn)證 403:已經(jīng)驗(yàn)證身份通過,但是服務(wù)器不予執(zhí)行 404:對客戶端請求服務(wù)端找不到資源 406 Not Acceptable - [GET]:用戶請求的格式不可得(比如用戶請求JSON格式,但是只有XML格式) 410 Gone -[GET]:用戶請求的資源被永久刪除,且不會再得到的 422 Unprocesable entity - [POST/PUT/PATCH] 當(dāng)創(chuàng)建一個(gè)對象時(shí),發(fā)生一個(gè)驗(yàn)證錯(cuò)誤 503:服務(wù)器暫時(shí)無法提供服務(wù),過一會就好了5.2 GET和POST的區(qū)別?
GET - 從指定的資源請求數(shù)據(jù)
POST - 向指定的資源提交要被處理的數(shù)據(jù)
大小限制
get 1024字節(jié) post 無限制,但可以自行設(shè)定
安全性
post較get安全
數(shù)據(jù)存放
get傳輸?shù)膮?shù)附在URL后面 post傳輸?shù)臄?shù)據(jù)放在HTTP請求體中
冪等
get是冪等的,post不是
緩存,收藏,歷史
get都可以,post沒有
6.關(guān)于網(wǎng)絡(luò)安全xss(cross site script)跨站腳本攻擊: Reflected XSS(基于反射的XSS攻擊):搜索框內(nèi)鍵入惡意代碼 Stored XSS(基于存儲的XSS攻擊):發(fā)布的帖子/文章鍵入惡意代碼 DOM-based or local XSS(基于DOM或本地的XSS攻擊):免費(fèi)WIFI中間網(wǎng)關(guān)對網(wǎng)頁修改嵌入惡意代碼 防范:前端對要顯示的內(nèi)容和服務(wù)端返回的內(nèi)容進(jìn)行轉(zhuǎn)碼htmlencode 服務(wù)端對請求的內(nèi)容進(jìn)行驗(yàn)證防范攻擊 xss攻擊主要是拿到cookie,所以可以禁止操作cookie,設(shè)置HttpOnly屬性 詳細(xì)見 https://segmentfault.com/a/1190000008423064
CSRF跨站請求偽造 cross site request forgery
詳情:https://segmentfault.com/a/1190000008424201 冒充用戶發(fā)起請求(在用戶不知情的情況下),完成一些違背用戶意愿的請求 (比如散布的小廣告點(diǎn)進(jìn)去就完成轉(zhuǎn)正操作了假如你剛剛登錄過網(wǎng)上銀行session依舊未過期) 防御方法: 驗(yàn)證HTTP請求頭部的referer即可知道是否是bank.com發(fā)起的請求; 請求地址中添加token并驗(yàn)證; HTTP頭部添加自定義屬性并驗(yàn)證; 驗(yàn)證碼
XSS:
攻擊者發(fā)現(xiàn)XSS漏洞——構(gòu)造代碼——發(fā)送給受害人——受害人打開——攻擊者獲取受害人的cookie——完成攻擊
CSRF:
攻擊者發(fā)現(xiàn)CSRF漏洞——構(gòu)造代碼——發(fā)送給受害人——受害人打開——受害人執(zhí)行代碼——完成攻擊
SQL注入攻擊 構(gòu)造巧妙的SQL語句,從而成功獲取想要的數(shù)據(jù);黑客的填空游戲
某個(gè)網(wǎng)站的登錄驗(yàn)證的SQL查詢代碼為:
strSQL = "SELECT * FROM users WHERE (name = "" + userName + "") and (pw = ""+ passWord +"");"
惡意填入
userName = "1" OR "1"="1";
與
passWord = "1" OR "1"="1";
時(shí),將導(dǎo)致原本的SQL字符串被填為
strSQL = "SELECT * FROM users WHERE (name = "1" OR "1"="1") and (pw = "1" OR "1"="1");"
也就是實(shí)際上運(yùn)行的SQL命令會變成下面這樣的
strSQL = "SELECT * FROM users;"
防御方法 : 對輸入進(jìn)行驗(yàn)證 整形參數(shù)判斷 unicode轉(zhuǎn)換等
7.關(guān)于跨域同源策略
1 協(xié)議相同
2 域名相同
3 端口相同
跨域的方法
1.window.postMessage(message,targetOrigin) (雙向跨域)
2.document.domain = 共同的主域名 跨子域 (雙向跨域)
http://www.a.com/a.js http://script.a.com/b.js 統(tǒng)一為主域名a.com
----------------------------------------------------------
3.jsonp(單向跨域)
只支持get請求
4.CORS跨域資源共享 (單向跨域)
比JSONP強(qiáng)大,支持各種類型的HTTP請求 允許瀏覽器向跨源服務(wù)器,發(fā)出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制 A跨域訪問B,需要在B的響應(yīng)頭加入 Access-Control-Allow-Origin:http://A
5.服務(wù)器代理 (單向跨域)
跨域的HTTP請求是在服務(wù)器端
6.window.name (單向跨域)
8.關(guān)于構(gòu)建工具gulp git grunt fis3gulpjs是一個(gè)前端構(gòu)建工具,與gruntjs相比:
gulpjs無需寫一大堆繁雜的配置參數(shù),
而且gulpjs使用的是nodejs中stream來讀取和操作數(shù)據(jù),其速度更快
npm install -g gulp 全局安裝到本機(jī)c盤data中 npm install gulp 安裝到本項(xiàng)目的node moudule模塊中 npm install --save-dev gulp 將gulp依賴添加到本項(xiàng)目的packge.json的依賴內(nèi)
就可以運(yùn)行g(shù)ulp命令執(zhí)行g(shù)ulpfile.js文件內(nèi)定義的default任務(wù)了
gulpfile.js內(nèi)
常用的四個(gè)API:gulp.task(), gulp.src(), gulp.dest(),gulp.watch()
gulp.src
gulp.src(globs) 獲取文件流對象,是虛擬文件對象流,進(jìn)而調(diào)用stream.pipe()繼續(xù)操作流 通過指定gulp.src()方法配置參數(shù)中的base屬性,我們可以更靈活的來改變gulp.dest()生成的文件路徑。 當(dāng)我們沒有在gulp.src()方法中配置base屬性時(shí),base的默認(rèn)值為通配符開始出現(xiàn)之前那部分路徑。 例子: gulp.src(script/lib/*.js, {base:"script"}) //配置了base參數(shù),此時(shí)base路徑為script //假設(shè)匹配到的文件為script/lib/jquery.js .pipe(gulp.dest("build")) //此時(shí)生成的文件路徑為 build/lib/jquery.js
gulp.dest
gulp.dest(path) 用來寫文件,path替換掉基本路徑就是生成的文件的路徑
gulp.task
gulp.task(name,[deps],fn) 任務(wù)的名字,依賴的任務(wù),執(zhí)行的方法 deps只有一個(gè)也要用數(shù)組括起來 如果任務(wù)A依賴B,B有異步編碼,A不會等B的異步代碼執(zhí)行完而是直接執(zhí)行,解決辦法: 1,執(zhí)行一個(gè)回調(diào)函數(shù)通知gulp異步完成 2,返回一個(gè)流對象 3,require Q;返回promise對象
gulp.watch
gulp.watch(glob,tasks) 匹配文件路徑 文件改變后執(zhí)行tasks(之前定義好的task,gulp.task(name,[deps],fn)) 詳情見 https://segmentfault.com/a/1190000008427866
對于GIT的提問
git rebase
git merge
等等 詳情見 https://segmentfault.com/a/11...
9.關(guān)于框架vue angularjsv-for ng-repeat new vue({el:data:methods:}) angular.module(name,[]) 繼而controller
angular controller之間通信方式:
上下級之間通信:作用域繼承、事件觸發(fā)($on、$emit 和 $boardcast)
同級之間通信:注入服務(wù) service、借助父級controller實(shí)現(xiàn)子級controller之間的通信、借助$rootScope實(shí)現(xiàn)同級之間的通信
10.關(guān)于nodejs創(chuàng)建簡單的服務(wù)器
var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); }).listen(8888);11.關(guān)于restfulAPI
1.協(xié)議
HTTPS協(xié)議
2.域名
可以添加次級域名 https://api.example.com 如果不需要擴(kuò)展,可以放在主域名下 https://example.com/api
3.版本
為API添加版本 https://api.example.com/v1/
4.不允許動詞
路徑名詞一般與數(shù)據(jù)庫表格一直 https://api.example.com/v1/animals
5.參數(shù)設(shè)計(jì)
參數(shù)鍵值形式 & 符號分開 https://api.example.com/v1/animals?name="cat"&sex="1"
6.錯(cuò)誤處理
請求結(jié)果是錯(cuò)誤的4xx 一般返回的JSON數(shù)據(jù)中設(shè)置erro鍵 { error: "Invalid API key" }
7.HTTP動詞
常用的:GET,POST GET(SELECT):從服務(wù)器取出資源(一項(xiàng)或多項(xiàng)) POST(CREATE):在服務(wù)器新建一個(gè)資源 另有: PUT(UPDATE):在服務(wù)器更新資源(客戶端提供改變后的完整資源) PATCH(UPDATE):在服務(wù)器更新資源(客戶端提供改變的屬性) DELETE(DELETE):從服務(wù)器刪除資源 HEAD:獲取資源的元數(shù)據(jù) OPTIONS:獲取信息,關(guān)于資源的哪些屬性是客戶端可以改變的
8.狀態(tài)碼
上翻有
12.關(guān)于異步編程ES 6以前:
回調(diào)函數(shù)(ajax實(shí)現(xiàn)異步的原理就是采用了回調(diào)函數(shù))
function f1(callback){ setTimeout(function () { // f1的任務(wù)代碼 callback(); }, 1000); } f1(f2);
問題:多層嵌套很混亂,異常難以捕獲
事件驅(qū)動/事件監(jiān)聽 發(fā)布/訂閱模式(觀察者模式)
原理同 回調(diào)
promise對象
promise模式在任何時(shí)刻都處于以下三種狀態(tài)之一: 未完成(unfulfilled)、已完成(resolved)和拒絕(rejected) promise對象上的then方法負(fù)責(zé)添加針對已完成和拒絕狀態(tài)下的處理函數(shù)。 then(resolvedHandler, rejectedHandler); then方法會返回另一個(gè)promise對象,以便于形成promise管道, 這種返回promise對象的方式能夠支持開發(fā)人員把異步操作串聯(lián)起來
ES 6:
* Generator函數(shù)(協(xié)程coroutine)
ES 7:
* async和await13.關(guān)于模塊化編程 requirejs seajs commonjs
AMD(Require遵循的規(guī)范)define, require
CMD(SeaJS遵循的規(guī)范)經(jīng)常使用的 API 只有 define, require, require.async, exports, module.exports 這五個(gè)
promise(commonJS提出的規(guī)范)
1.對于依賴的模塊,AMD 是提前執(zhí)行,CMD 是延遲執(zhí)行。 不過 RequireJS 從 2.0 開始,也改成可以延遲執(zhí)行(根據(jù)寫法不同,處理方式不同) 2.CMD 推崇依賴就近,AMD 推崇依賴前置。14.關(guān)于面向?qū)ο?/b> 14.1封裝性
JS沒有類,怎么談封裝呢。有對象,對象有屬性
有構(gòu)造函數(shù),構(gòu)造函數(shù)有基本屬性值和引用屬性值
函數(shù)有prototype原型,可以實(shí)現(xiàn)屬性方法共享
14.2多態(tài)性 14.3繼承性某一對象的實(shí)例 賦值給 另一個(gè)對象的原型 實(shí)現(xiàn)繼承
構(gòu)造函數(shù)、實(shí)例、原型的關(guān)系:
var a = function(){...}; var b = new a();//b 是由 a 構(gòu)造出來的 var c = function(){...}; c.prototype = b;//c 繼承了 a15.關(guān)于跨設(shè)備響應(yīng)式
1.百分比
2.移動端禁viewport縮放功能
width:viewport 的寬度,可以指定一個(gè)固定值,如650;或者可以是device-width,表示設(shè)備的寬度 height:和 width 相對應(yīng),可指定高度 initial-scale:頁面初始縮放比例(0-1) maximum-scale:允許用戶縮放到的最大比例(0-1) minimum-scale:允許用戶縮放到的最小比例(0-1) user-scalable:用戶是否可以手動縮放(yes/no)
禁用chrome 自調(diào)節(jié)字體大小 body { -webkit-text-size-adjust: 100%; }
3.CSS3 media queries
@media only screen and (max/min-width/height: 960px) { /* 樣式定義 */ } @media only screen and (max-width:500px){ .outDiv { margin: 0 auto; } }16.關(guān)于瀏覽器兼容
簡單總結(jié)
css 樣式加前綴 -webkit這樣子的 js 冒泡事件和阻止冒泡
很多見:http://blog.csdn.net/xingxing...
http://blog.csdn.net/comeonj/...
17.關(guān)于linux暫且放兩個(gè)鏈接 之前寫過的:
https://segmentfault.com/a/11...
https://segmentfault.com/n/13...
18. 前端性能優(yōu)化HTTP:減少HTTP請求;解決辦法:合并圖片,合并css,js文件,lazzyload懶加載圖片
CSS:合理用reflow,repaint:style變一次就reflow一次,因此盡可能設(shè)一個(gè)新的class,改變className,reflow一次
DOM:減少DOM操作,多用innerHTML一次添加
JSON格式交換數(shù)據(jù),輕量級數(shù)據(jù)
css放在頭部,js放在尾部,外部引用
6.CDN內(nèi)容分發(fā)網(wǎng)絡(luò),實(shí)時(shí)性不太好
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/50474.html
摘要:加上等于在頁面完全載入后再執(zhí)行,相當(dāng)于文檔載入后即執(zhí)行,不用等包括圖片在內(nèi)的資源下載完畢。對于請求,表示請求還沒有被處理,客戶端應(yīng)該向里的重新發(fā)起請求。 1.關(guān)于基礎(chǔ)css html js部分 1.1基本算法 1)快速排序 時(shí)間復(fù)雜度 nlogn function quickSort(arr){ if (arr.length = pivort) { ri...
摘要:加上等于在頁面完全載入后再執(zhí)行,相當(dāng)于文檔載入后即執(zhí)行,不用等包括圖片在內(nèi)的資源下載完畢。對于請求,表示請求還沒有被處理,客戶端應(yīng)該向里的重新發(fā)起請求。 1.關(guān)于基礎(chǔ)css html js部分 1.1基本算法 1)快速排序 時(shí)間復(fù)雜度 nlogn function quickSort(arr){ if (arr.length = pivort) { ri...
摘要:使用簡記后端掘金全稱為即消息隊(duì)列。優(yōu)測優(yōu)社區(qū)干貨精選老司機(jī)亂談編輯器之神掘金前言是一種信仰,我自從年有了這個(gè)信仰,已經(jīng)個(gè)年頭了。 PHP 程序員進(jìn)階學(xué)習(xí)書籍參考指南 - 后端 - 掘金PHP程序員進(jìn)階學(xué)習(xí)書籍參考指南 @heiyeluren lastmodify: 2016/2/18 ... 當(dāng)我們在談?wù)撉岸思用軙r(shí),我們在談些什么 - 前端 - 掘金潘建旭,豈安科技(www.bigse...
閱讀 2299·2021-11-24 09:39
閱讀 2543·2021-11-22 15:24
閱讀 2982·2021-09-02 09:48
閱讀 3019·2021-07-26 22:01
閱讀 1439·2019-08-30 11:09
閱讀 1677·2019-08-29 18:47
閱讀 610·2019-08-29 15:40
閱讀 2138·2019-08-29 15:22