日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

前端知识点总结---面试专用

發(fā)布時間:2023/12/9 HTML 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 前端知识点总结---面试专用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.關于基礎css html js部分

1.1基本算法

1)快速排序

時間復雜度 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) 二分查找算法

時間復雜度:logn(以2為底n的對數(shù))

二分查找的基本思想是將n個元素分成大致相等的兩部分,去a[n/2]與x做比較,如果x=a[n/2],則找到x,算法中止;如果x<a[n/2],則只要在數(shù)組a的左半部分繼續(xù)搜索x,如果x>a[n/2],則只要在數(shù)組a的右半部搜索x.時間復雜度無非就是while循環(huán)的次數(shù)!總共有n個元素,漸漸跟下去就是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ù))所以時間復雜度可以表示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個節(jié)點逐次插入到第一個節(jié)點后,最后將第一個節(jié)點挪到新表的結尾

例子為單向鏈表,頭結點為空

時間復雜度: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個節(jié)點

function searchK (list, k) {var head = list.head;if (head == null || k == 0) {return null;}//第一個節(jié)點先向前走K-1步var firstNode = head;for (var i = 0; i < k-1; i++) {firstNode = firstNode.next;}//判斷鏈表長度是否有K長if (i!== k-1) { return null;}//兩個節(jié)點同時走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;i<len;i++){if(_isNaN(arr[i])){if(!hash[arr[i]]){hash['NaN'] = true;res.push(arr[i]); }}else{type = typeof arr[i];key = type + arr[I];if(!hash[key]){hash[key] = true;res.push(arr[i]);}}}return res; }

7)兩個棧實現(xiàn)一個隊列
https://segmentfault.com/a/11...

1.2 replace,match,search正則匹配是string的方法

str.replace(/ /g,'20%'); g表示全局匹配,不會匹配完第一個就不匹配了i忽略大小寫m多行匹配

1.3 Rexg正則匹配test,exec

test,返回一個 Boolean 值,它指出在被查找的字符串中是否存在模式。 如果存在則返回 true,否則就返回 false。exec,用正則表達式模式在字符串中運行查找 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%'); 0var str=" 12 er 45 ;; ";str.search(/ /g,'20%'); 0var str=" 12 er 45 ;; ";var rexg=/ /;rexg.test(str); true

1.4 閉包

定義:

  • 可以訪問外部函數(shù)作用于中變量的函數(shù)
  • 被內(nèi)部函數(shù)引用的外部函數(shù)的變量保存在外部作用域中而不被回收
  • 優(yōu)缺點:

    優(yōu)點:

    變量私有化

    減少全局變量污染

    可以讓一個變量常駐內(nèi)存

    缺點:

    內(nèi)存泄漏

    閉包會攜帶包含它的函數(shù)的作用域,因此會比其他函數(shù)占用更多的內(nèi)存

    1.5 js數(shù)組

    數(shù)組可以當棧用:

    arr.unshift(val)進棧,依次向前插入arr.pop()出棧 取得數(shù)組最后一項,原數(shù)組改變減少最后一項實現(xiàn)了先進后出

    數(shù)組當隊列或者正常數(shù)組用:

    arr.push(val),順序添加 arr.shift(),拋出第一個值即arr[0],原數(shù)組改變減少第一項

    2.關于JS延遲加載

    JS延遲加載的方式:1.位置,js放在</body>結束標簽前 2.監(jiān)聽,window.onload后再添加script標簽3.屬性,為script標簽添加屬性defer或async 4.ajax下載js腳本后eval()執(zhí)行

    3.defer和async的比較

    3.1 defer="defer",defer默認false: 該屬性用來通知瀏覽器,這段腳本代碼將不會產(chǎn)生任何文檔內(nèi)容。 例如 JavaScript代碼中的document.write()方法將不會騎作用,瀏覽器遇到這樣的代碼將會忽略,并繼續(xù)執(zhí)行后面的代碼。 屬性只能是 defer,與屬性名相同。 在HTML語法格式下,也允許不定義屬性值,僅僅使用屬性名。3.2 async="true/false",只寫async省略屬性值的情況下為true: 該屬性為html5中新增的屬性,它的作用是能夠異步地下載和執(zhí)行腳本,不因為加載腳本而阻塞頁面的加載。 一旦下載完畢就會立刻執(zhí)行。加上defer 等于在頁面完全載入后再執(zhí)行,相當于文檔載入后即執(zhí)行,不用等包括圖片在內(nèi)的資源下載完畢。 async和defer一樣,都不會阻塞其他資源下載,所以不會影響頁面的加載, 但在async的情況下,js文檔一旦下載完畢就會立刻執(zhí)行,所以很有可能不是按照原本的順序來執(zhí)行,如果js有依賴性,就要注意了。3.3 相同點: 加載文件時不阻塞頁面渲染; 使用這兩個屬性的腳本中不能調(diào)用document.write方法; 允許不定義屬性值,僅僅使用屬性名;3.4 不同點: html的版本html4.0中定義了defer;html5.0中定義了async;這將造成由于瀏覽器版本的不同而對其支持的程度不同;執(zhí)行時刻:每一個async屬性的腳本都在它下載結束之后立刻執(zhí)行,同時會在window的load事件之前執(zhí)行。 所以就有可能出現(xiàn)腳本執(zhí)行順序被打亂的情況; 每一個defer屬性的腳本都是在頁面解析完畢之后,按照原本的順序執(zhí)行,同時會在document的DOMContentLoaded之前執(zhí)行。3.5 混合用 如果async為true,那么腳本在下載完成后異步執(zhí)行。 如果async為false,defer為true,那么腳本會在頁面解析完畢之后執(zhí)行。 如果async和defer都為false,那么腳本會在頁面解析中,停止頁面解析,立刻下載并且執(zhí)行。

    4.關于ajax

    var xhr = new XMLHttpRequest(); IE new ActiveXObject("Microsoft.XMLHTTP");

    1.xhr.open()

    三個參數(shù):1)請求方式,post/get2)請求的URL3)是否發(fā)送異步請求 true/false

    注意: 只是啟動,并未發(fā)送請求,要調(diào)用send

    2.xhr.send()

    一個參數(shù):必須有參數(shù)為http請求的主體post請求一般傳入get請求必須傳入null

    發(fā)送后得到服務器的響應,響應的數(shù)據(jù)會自動填充xhr的屬性

    responseText,響應主體responseXMLstatus,http狀態(tài)碼statusText,狀態(tài)說明

    3.xhr.readyState

    如何判斷服務器響應已到位,如何判斷響應所處階段

    xhr.readyState:0,1,2,3,4 4表示完成,收到全部響應

    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ù)鍵和值進行編碼,保證格式正確2) 鍵=值對之間以 & 分隔 function addURLParam(url,name,value){url + = (url.indexOf("?") = = -1 ? "?" : "&");url + = encodeURIComponent(name) + "=" + encodeURIComponent(value);return url; }

    POST

    XMLHttpRequest 1級的實現(xiàn):1)Content-Type的設置: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("超時未收到響應"); };在規(guī)定時間內(nèi)瀏覽器未收到響應就觸發(fā) ontimeout 事件

    5.關于web存儲

    5.1 cookie,sessionStorage,localStorage區(qū)別?

    sessionStorage,loalStorage統(tǒng)稱webStorage;Cookie的作用是與服務器進行交互,作為HTTP規(guī)范的一部分而存在,而Web Storage僅僅是為了在本地“存儲”數(shù)據(jù)而生

    (1)存儲大小:

    cookie,4k; sessionStorage,localStorage,5M或更大;

    (2)過期時間:

    cookie,過期時間前一直有效,默認cookie(沒有設置expires的cookie)失效時間直到關閉瀏覽器,設置方式保留COOKIES一個小時------Response.Cookies("MyCookie").Expires = DateAdd("h", 1, Now());sessionStorage關閉即刪除,只要同源的同窗口(或tab)中,刷新頁面或進入同源的不同頁面,數(shù)據(jù)始終存在loalStorage永不丟失

    (3)服務器交互帶寬使用情況:

    cookie放在請求頭發(fā)送給服務端,浪費帶寬sessionStorage,loalStorage無于服務端交互

    (4)存儲位置:

    cookie以鍵值對形式存儲在http請求的header中發(fā)送給服務端,同時從服務端獲得的cookie是 鍵=值分號隔開的形式存儲 sessionStorage,localStorage存儲在本地

    (5)共享:

    cookie受同源策略限制sessionStorage同一窗口共享localStorage受同源限制

    (6)用法:

    cookie需要自己封裝方法* escape()函數(shù)是JS內(nèi)置函數(shù),編碼將字符串編碼為16進制,unescape()解碼 1.添加一個cookie <script language="JavaScript" type="text/JavaScript"> <!-- function addcookie(name,value,expireHours){var cookieString=name+"="+escape(value);//判斷是否設置過期時間if(expireHours>0){var date=new Date();date.setTime(date.getTime()+expireHours*3600*1000);cookieString=cookieString+"; expire="+date.toGMTString();// 或者cookieString+=";max-age="+60*5; /* 設置cookie的有效期為5分鐘 */}document.cookie=cookieString; } //--> </script> 2.獲取指定名稱的cookie值:getcookie(name) 該函數(shù)返回名稱為name的cookie值,如果不存在則返回空,其實現(xiàn)如下: <script language="JavaScript" type="text/JavaScript"> <!-- function getcookie(name){var strcookie=document.cookie;var arrcookie=strcookie.split(";");for(var i=0,len=arrcookie.length;i<len;i++){var arr=arrcookie[i].split("=");if(arr[0]==name)return unescape(arr[1]);}return ""; } //--> </script> 3.刪除指定名稱的cookie:deletecookie(name) 該函數(shù)可以刪除指定名稱的cookie,其實現(xiàn)如下: <script language="JavaScript" type="text/JavaScript"> <!-- function deletecookie(name){var cookieValue = getCookie(name);var cookieString = null;if(cookieValue!== "" || cookieValue!==null){cookieString = name + "=" + escape(cookieValue) + ";max-age=" + 0;}document.cookie = cookieString; } //--> </script> cookie 的屬性:Domain(設置子域該域下才可訪問cookie)HttpOnly(設置后將不能用JS腳本操作cookie),Secure(設置后將只能通過HTTPS協(xié)議訪問),Expiress(過期時間,不設置默認關閉瀏覽器cookie失效),目前已被max-age屬性所取代 max-age用秒來設置cookie的生命周期Path(設置路徑的頁面才可訪問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.關于http

    5.1 狀態(tài)碼

    200 OK - [GET]:服務器成功返回用戶請求的數(shù)據(jù),該操作是冪等的(Idempotent)201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數(shù)據(jù)成功202 Accepted - [*]:表示一個請求已經(jīng)進入后臺排隊(異步任務)204 NO CONTENT - [DELETE]:用戶刪除數(shù)據(jù)成功。301,302,303 redirect:重定向;301永久性重定向 增加SEO排名,說說302臨時重定向,303:對于POST請求,它表示請求已經(jīng)被處理,客戶端可以接著使用GET方法去請求Location里的URI。307:對于POST請求,表示請求還沒有被處理,客戶端應該向Location里的URI重新發(fā)起POST請求。304not modified:未修改返回緩存的內(nèi)容不再請求新的;request If-None-Match400:客戶端的URL輸入有問題,瀏覽器解析不出來 401:需要身份驗證403:已經(jīng)驗證身份通過,但是服務器不予執(zhí)行404:對客戶端請求服務端找不到資源406 Not Acceptable - [GET]:用戶請求的格式不可得(比如用戶請求JSON格式,但是只有XML格式)410 Gone -[GET]:用戶請求的資源被永久刪除,且不會再得到的422 Unprocesable entity - [POST/PUT/PATCH] 當創(chuàng)建一個對象時,發(fā)生一個驗證錯誤503:服務器暫時無法提供服務,過一會就好了

    5.2 GET和POST的區(qū)別?

    GET - 從指定的資源請求數(shù)據(jù)

    POST - 向指定的資源提交要被處理的數(shù)據(jù)

    大小限制

    get 1024字節(jié)post 無限制,但可以自行設定

    安全性

    post較get安全

    數(shù)據(jù)存放

    get傳輸?shù)膮?shù)附在URL后面post傳輸?shù)臄?shù)據(jù)放在HTTP請求體中

    冪等

    get是冪等的,post不是

    緩存,收藏,歷史

    get都可以,post沒有

    6.關于網(wǎng)絡安全

    xss(cross site script)跨站腳本攻擊:Reflected XSS(基于反射的XSS攻擊):搜索框內(nèi)鍵入惡意代碼Stored XSS(基于存儲的XSS攻擊):發(fā)布的帖子/文章鍵入惡意代碼DOM-based or local XSS(基于DOM或本地的XSS攻擊):免費WIFI中間網(wǎng)關對網(wǎng)頁修改嵌入惡意代碼防范:前端對要顯示的內(nèi)容和服務端返回的內(nèi)容進行轉(zhuǎn)碼htmlencode服務端對請求的內(nèi)容進行驗證防范攻擊xss攻擊主要是拿到cookie,所以可以禁止操作cookie,設置HttpOnly屬性詳細見 https://segmentfault.com/a/1190000008423064

    CSRF跨站請求偽造 cross site request forgery

    詳情:https://segmentfault.com/a/1190000008424201冒充用戶發(fā)起請求(在用戶不知情的情況下),完成一些違背用戶意愿的請求 (比如散布的小廣告點進去就完成轉(zhuǎn)正操作了假如你剛剛登錄過網(wǎng)上銀行session依舊未過期)防御方法:驗證HTTP請求頭部的referer即可知道是否是bank.com發(fā)起的請求;請求地址中添加token并驗證;HTTP頭部添加自定義屬性并驗證;驗證碼
    • XSS:

    攻擊者發(fā)現(xiàn)XSS漏洞——構造代碼——發(fā)送給受害人——受害人打開——攻擊者獲取受害人的cookie——完成攻擊

    • CSRF:

    攻擊者發(fā)現(xiàn)CSRF漏洞——構造代碼——發(fā)送給受害人——受害人打開——受害人執(zhí)行代碼——完成攻擊

    SQL注入攻擊構造巧妙的SQL語句,從而成功獲取想要的數(shù)據(jù);黑客的填空游戲
    • 某個網(wǎng)站的登錄驗證的SQL查詢代碼為:

      strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"

      • 惡意填入

      userName = "1' OR '1'='1";

      passWord = "1' OR '1'='1";

      • 時,將導致原本的SQL字符串被填為

      strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"

      • 也就是實際上運行的SQL命令會變成下面這樣的

      strSQL = "SELECT * FROM users;"

      防御方法 : 對輸入進行驗證 整形參數(shù)判斷 unicode轉(zhuǎn)換等

    7.關于跨域

    同源策略

    1 協(xié)議相同

    2 域名相同

    3 端口相同

    跨域的方法

    1.window.postMessage(message,targetOrigin) (雙向跨域)

    2.document.domain = 共同的主域名 跨子域 (雙向跨域)

    http://www.a.com/a.jshttp://script.a.com/b.js統(tǒng)一為主域名a.com

    ----------------------------------------------------------

    3.jsonp(單向跨域)

    只支持get請求 <script src=".../callback()"></script>

    4.CORS跨域資源共享 (單向跨域)

    比JSONP強大,支持各種類型的HTTP請求允許瀏覽器向跨源服務器,發(fā)出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制A跨域訪問B,需要在B的響應頭加入 Access-Control-Allow-Origin:http://A

    5.服務器代理 (單向跨域)

    跨域的HTTP請求是在服務器端

    6.window.name (單向跨域)

    8.關于構建工具gulp git grunt fis3

    gulpjs是一個前端構建工具,與gruntjs相比:

    gulpjs無需寫一大堆繁雜的配置參數(shù),

    而且gulpjs使用的是nodejs中stream來讀取和操作數(shù)據(jù),其速度更快

    npm install -g gulp 全局安裝到本機c盤data中npm install gulp 安裝到本項目的node moudule模塊中npm install --save-dev gulp 將gulp依賴添加到本項目的packge.json的依賴內(nèi)

    就可以運行gulp命令執(zhí)行gulpfile.js文件內(nèi)定義的default任務了

    gulpfile.js內(nèi)

    常用的四個API:gulp.task(), gulp.src(), gulp.dest(),gulp.watch()

    gulp.src

    gulp.src(globs) 獲取文件流對象,是虛擬文件對象流,進而調(diào)用stream.pipe()繼續(xù)操作流通過指定gulp.src()方法配置參數(shù)中的base屬性,我們可以更靈活的來改變gulp.dest()生成的文件路徑。當我們沒有在gulp.src()方法中配置base屬性時,base的默認值為通配符開始出現(xiàn)之前那部分路徑。例子: gulp.src(script/lib/*.js, {base:'script'}) //配置了base參數(shù),此時base路徑為script //假設匹配到的文件為script/lib/jquery.js.pipe(gulp.dest('build')) //此時生成的文件路徑為 build/lib/jquery.js

    gulp.dest

    gulp.dest(path) 用來寫文件,path替換掉基本路徑就是生成的文件的路徑

    gulp.task

    gulp.task(name,[deps],fn) 任務的名字,依賴的任務,執(zhí)行的方法deps只有一個也要用數(shù)組括起來如果任務A依賴B,B有異步編碼,A不會等B的異步代碼執(zhí)行完而是直接執(zhí)行,解決辦法:1,執(zhí)行一個回調(diào)函數(shù)通知gulp異步完成 2,返回一個流對象 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.關于框架vue angularjs

    v-for ng-repeatnew vue({el:data:methods:}) angular.module(name,[]) 繼而controller

    angular controller之間通信方式:

    上下級之間通信:作用域繼承、事件觸發(fā)($on、$emit 和 $boardcast)

    同級之間通信:注入服務 service、借助父級controller實現(xiàn)子級controller之間的通信、借助$rootScope實現(xiàn)同級之間的通信

    10.關于nodejs

    創(chuàng)建簡單的服務器

    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.關于restfulAPI

    1.協(xié)議

    HTTPS協(xié)議

    2.域名

    可以添加次級域名https://api.example.com如果不需要擴展,可以放在主域名下https://example.com/api

    3.版本

    為API添加版本https://api.example.com/v1/

    4.不允許動詞

    路徑名詞一般與數(shù)據(jù)庫表格一直https://api.example.com/v1/animals

    5.參數(shù)設計

    參數(shù)鍵值形式 & 符號分開https://api.example.com/v1/animals?name='cat'&sex='1'

    6.錯誤處理

    請求結果是錯誤的4xx一般返回的JSON數(shù)據(jù)中設置erro鍵{error: "Invalid API key" }

    7.HTTP動詞

    常用的:GET,POSTGET(SELECT):從服務器取出資源(一項或多項)POST(CREATE):在服務器新建一個資源另有:PUT(UPDATE):在服務器更新資源(客戶端提供改變后的完整資源)PATCH(UPDATE):在服務器更新資源(客戶端提供改變的屬性)DELETE(DELETE):從服務器刪除資源HEAD:獲取資源的元數(shù)據(jù)OPTIONS:獲取信息,關于資源的哪些屬性是客戶端可以改變的

    8.狀態(tài)碼

    上翻有

    12.關于異步編程

    ES 6以前:

    • 回調(diào)函數(shù)(ajax實現(xiàn)異步的原理就是采用了回調(diào)函數(shù))

      function f1(callback){setTimeout(function () {// f1的任務代碼callback();}, 1000);}f1(f2);

      問題:多層嵌套很混亂,異常難以捕獲

    • 事件驅(qū)動/事件監(jiān)聽 發(fā)布/訂閱模式(觀察者模式)

      原理同 回調(diào)
    • promise對象

      promise模式在任何時刻都處于以下三種狀態(tài)之一: 未完成(unfulfilled)、已完成(resolved)和拒絕(rejected)promise對象上的then方法負責添加針對已完成和拒絕狀態(tài)下的處理函數(shù)。 then(resolvedHandler, rejectedHandler); then方法會返回另一個promise對象,以便于形成promise管道, 這種返回promise對象的方式能夠支持開發(fā)人員把異步操作串聯(lián)起來

    ES 6:

    * Generator函數(shù)(協(xié)程coroutine)

    ES 7:

    * async和await

    13.關于模塊化編程 requirejs seajs commonjs

    • AMD(Require遵循的規(guī)范)define, require

    • CMD(SeaJS遵循的規(guī)范)經(jīng)常使用的 API 只有 define, require, require.async, exports, module.exports 這五個

    • promise(commonJS提出的規(guī)范)

      1.對于依賴的模塊,AMD 是提前執(zhí)行,CMD 是延遲執(zhí)行。 不過 RequireJS 從 2.0 開始,也改成可以延遲執(zhí)行(根據(jù)寫法不同,處理方式不同)2.CMD 推崇依賴就近,AMD 推崇依賴前置。

    14.關于面向?qū)ο?/h2>

    14.1封裝性

    JS沒有類,怎么談封裝呢。有對象,對象有屬性

    有構造函數(shù),構造函數(shù)有基本屬性值和引用屬性值

    函數(shù)有prototype原型,可以實現(xiàn)屬性方法共享

    14.2多態(tài)性

    14.3繼承性

    某一對象的實例 賦值給 另一個對象的原型 實現(xiàn)繼承

    構造函數(shù)、實例、原型的關系:

    var a = function(){...};var b = new a();//b 是由 a 構造出來的var c = function(){...};c.prototype = b;//c 繼承了 a

    15.關于跨設備響應式

    1.百分比

    2.移動端禁viewport縮放功能

    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" /> width:viewport 的寬度,可以指定一個固定值,如650;或者可以是device-width,表示設備的寬度height:和 width 相對應,可指定高度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.關于瀏覽器兼容

    簡單總結

    css 樣式加前綴 -webkit這樣子的js 冒泡事件和阻止冒泡

    很多見:http://blog.csdn.net/xingxing...

    http://blog.csdn.net/comeonj/...

    17.關于linux

    暫且放兩個鏈接 之前寫過的:

    https://segmentfault.com/a/11...

    https://segmentfault.com/n/13...

    18. 前端性能優(yōu)化

  • HTTP:減少HTTP請求;解決辦法:合并圖片,合并css,js文件,lazzyload懶加載圖片
  • CSS:合理用reflow,repaint:style變一次就reflow一次,因此盡可能設一個新的class,改變className,reflow一次
  • DOM:減少DOM操作,多用innerHTML一次添加
  • JSON格式交換數(shù)據(jù),輕量級數(shù)據(jù)
  • css放在頭部,js放在尾部,外部引用
  • 6.CDN內(nèi)容分發(fā)網(wǎng)絡,實時性不太好

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

    總結

    以上是生活随笔為你收集整理的前端知识点总结---面试专用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。