前端試題(四)

1. vue過濾器使用場景

2. v-on綁定多個方法

<p v-on="{click:dbClick,mousemove:MouseClick}"></p>

一個事件綁定多個函數:

<p @click="one(),two()">點擊</p>

3. 在菜單結構不確定時,前端如何動態渲染

樹形結構:深度遍歷、廣度遍歷(遞歸)

4. Vue-router的鉤子函數

[Vue的鉤子函數路由導航守衛、keep-alive、生命周期鉤子

路由導航守衛
在這里插入圖片描述

5. Vue-router的實現原理

更新視圖但不重新請求頁面,是前端路由原理的核心之一,目前在瀏覽器環境中這一功能的實現主要有2種方式,Hash模式和History模式。

6. Vuex的實現原理

Vuex是一個專為Vue服務,用于管理頁面數據狀態、提供統一數據操作的生態系統。它集中于MVC模式中的Model層,規定所有的數據操作必須通過 action - mutation - state change 的流程來進行,再結合Vue的數據視圖雙向綁定特性來實現頁面的展示更新。統一的頁面狀態管理以及操作處理,可以讓復雜的組件交互變得簡單清晰,同時可在調試模式下進行時光機般的倒退前進操作,查看數據改變過程,使code debug更加方便。
Vuex框架原理與源碼分析

7. Vue-cli的自定義指令

像vue ui那樣在終端用的指令??還是vue的自定義指令

8. keep-alive的兩個屬性

在開發Vue項目的時候,大部分組件是沒必要多次渲染的,所以Vue提供了一個內置組件keep-alive來緩存組件內部狀態,避免重新渲染。

  1. 緩存路由組件:將所有路徑匹配到的路由組件都緩存起來(某個組件切換后不進行銷毀,而是保存之前的狀態)
    <keep-alive><router-view></router-view></keep-alive>

缺點:所有的路由組件都被緩存了,嚴重浪費性能,而且也不符合需求

  1. 緩存特定組件

在keep-alive上有兩個屬性,只有匹配的組件會被緩存。

  • include 值為字符串或者正則表達式匹配的組件name會被緩存。
  • exclude 值為字符串或正則表達式匹配的組件name不會被緩存。
  1. 路由的meta屬性
    除了方法二,我們還可以利用路由中的meta屬性來控制
{path: '/',name: 'home',meta:{keepAlive:true},component: Home}

新的問題:組件被緩存,并沒有被銷毀,所以組件在切換的時候也就不會被重新創建,自然也就不會調用created等生命周期函數,所以此時要使用activated與deactivated來獲取當前組件是否處于活動狀態。

  • 在home組件里面寫入了activated與deactivated生命周期函數:
activated(){console.log("哎呀看見我了")console.log("----------activated--------")},deactivated(){console.log("討厭!!你又走了")console.log("----------deactivated--------")}

9. keep-alive組件

10. Vue的核心

Vue核心思想

11. Vue的修飾符

  1. 修飾符
  2. 事件修飾符
  3. 按鍵修飾符
  4. 系統修飾符
    vue常用的修飾符

12. ES5、ES6的區別

所有es6的新特性都要答到
JavaScript、ES5和ES6的介紹和區別

13. 單頁面應用的原理和優缺點

單頁面應用指只有一個主頁面的應用,瀏覽器一開始就要加載所有必須的html,js,ss,單頁面的頁面跳轉僅刷新局部資源,多應用于pc端,
多頁面就是指一個頁面中有多個頁面,頁面跳轉時是整頁刷新
單頁面優點:
1.用戶體驗好,快,內容改變不需要重新加載整個頁面;
2.沒有頁面之間的切換,就不會出現“白屏現象”
單頁面缺點:
1.首次加載耗時比較多;
2.不利于SEO
3.不可以用導航實現前進后退效果;
4.頁面復雜度高

14. 瀏覽器兼容

15. 前端文件上傳

百度的webuploader,基于jquery封裝的

原生ajax上傳/axios.post上傳+進度條+后端接收文件

15.1 原生

掘金:前端本地文件(圖片)操作與上傳,并顯示在頁面中

底層實現還是基于input輸入框,然后利用onchange事件,監聽文件選擇的事件,然后利用formData對象裝載需要上傳的文件,最后通過XMLHttpRequest來進行文件的網絡異步傳輸。
inputDom.files[0]
var fd=new FormData()
fd.append('pic',pic)
xhr.upload.onprogress

  1. lengthComputable
  2. loaded
  3. total

這里的處理,在于如何顯示出來(讀取文件)
let fileReader = new FileReader()
fileReader.onload
fileReader.readAsDataURL(this.files[0])賦值給img標簽的src

15.1.1 在ipt的onchange事件里打印this對象,有files屬性,是一個數組

在這里插入圖片描述

15.1.2 打印files[0]

在這里插入圖片描述

15.1.3 input dom對象的value值

在這里插入圖片描述

<script type="text/javascript">
function upfile(){var pic=document.getElementsByTagName('input')[0].files[0];var fd=new FormData();var xhr=new XMLHttpRequest();xhr.open('post','01.php',true);xhr.onreadystatechange=function (){//readystate為4表示請求已完成并就緒if(this.readyState==4){document.getElementById('precent').innerHTML=this.responseText;//在進度條下方插入百分比}}xhr.upload.onprogress=function (ev){//如果ev.lengthComputable為true就可以開始計算上傳進度//上傳進度 = 100* ev.loaded/ev.totalif(ev.lengthComputable){var precent=100 * ev.loaded/ev.total;console.log(precent);//更改進度條,及百分比document.getElementById('bar').style.width=precent+'%';document.getElementById('precent').innerHTML=Math.floor(precent)+'%';}}fd.append('pic',pic);xhr.send(fd);}
</script>
  • input標簽在選擇同一個文件上傳時的bug處理
    input在上傳文件的時候,如果連續上傳同一個文件的時候,會出現上傳無效的bug。這個問題出現在第二次選擇同一個文件的時候,input的onchange方法并不會觸發執行。

解決這個問題,上網搜索了一下,找到了辦法,就是需要重新設定input的type屬性。每次選擇完文件后,將input元素的type設置成text,然后在下一次click的時候將其設置成file,再觸發onchange事件,解決這個問題。

15.2 拖拽、粘貼

15.2.1 enctype
  1. 編碼格式是multipart/form-data<form enctype="multipart/form-data" method="post">
    參數和參數之間是且一個相同的字符串隔開的,比如這里是:
    ------WebKitFormBoundary72yvM25iSPYZ4a3F
    在這里插入圖片描述
  2. 編碼是application/x-www-form-urlencoded
    參數和參數之間使用&連接,如:
key1=value1&key2=value2

如果直接就是一個FormData了,那么直接用ajax發出去就行了,不用做任何處理。

15.2.2 拖拽

dragover事件
event.originalEvent.dataTransfer.files[0]
fileReader讀url,formData,append

$(".img-container").on("dragover", function (event) {event.preventDefault();
}).on("drop", function(event) {event.preventDefault();// 數據在event的dataTransfer對象里let file = event.originalEvent.dataTransfer.files[0];// 然后就可以使用FileReader進行操作fileReader.readAsDataURL(file);// 或者是添加到一個FormDatalet formData = new FormData();formData.append("fileContent", file);
})
15.2.3 粘貼

contenteditable="true"
paste
event.originalEvent.clipboardData.files[0]

 <div contenteditable="true">hello, paste your image here</div>
$("#editor").on("paste", function(event) {let file = event.originalEvent.clipboardData.files[0];
});

15.3 分片 斷點續傳

  1. 七牛云

1、修改服務端上傳的限制配置;Nginx 以及 PHP 的上傳文件限制 不宜過大,一般5M 左右為好;
2、大文件分片,一片一片的傳到服務端,再由服務端合并。這么做的好處在于一旦上傳失敗只是損失一個分片而已,不用整個文件重傳,而且每個分片的大小可以控制在4MB以內,服務端限制在4M即可。
3、使用七牛JavaScript SDK分片上傳
博客園斷點續傳

15.4 如何限制值只能上傳png格式

文件頭信息
hexdump

15.5 如何判斷文件唯一性

  1. 算hash值,比如md5
<input type="file"><script src="md5.js"></script><script>//https://www.npmjs.com/package/js-md5var input  = document.querySelector('input');input.addEventListener('change', function () {var file=  this.files[0];var reader = new FileReader();reader.readAsArrayBuffer(file);reader.addEventListener('load',function (e) {var buffer = e.target.result;var md = md5(buffer);console.log(md);});});</script>
  1. 文件過大,怎么算md5不卡頓:
  • web-worker
  • 時間切片(react fiber架構 requestldleCallback)
  • 抽樣

15.6 文件切片數量過多,上傳請求過多,導致卡頓,怎么處理

  1. 控制異步任務并發數量(如果有報錯怎么重試,報錯三次怎么統一終止所有切片)

15.7 移動端/pc端,每個切片大小如何控制

根據網速來動態調整包的大小

15.8 并發數+包控制如何實現


五月分割線

16. 瀏覽器緩存

在這里插入圖片描述

1. DNS緩存

有dns的地方,就有緩存。瀏覽器、操作系統、Local DNS、根域名服務器,它們都會對DNS結果做一定程度的緩存。

DNS查詢過程如下:

  1. 首先搜索瀏覽器自身的DNS緩存,如果存在,則域名解析到此完成。
  2. 如果瀏覽器自身的緩存里面沒有找到對應的條目,那么會嘗試讀取操作系統的hosts文件看是否存在對應的映射關系,如果存在,則域名解析到此完成。
  3. 如果本地hosts文件不存在映射關系,則查找本地DNS服務器(ISP服務器,或者自己手動設置的DNS服務器),如果存在,域名到此解析完成。
  4. 如果本地DNS服務器還沒找到的話,它就會向根服務器發出請求,進行遞歸查詢。

2. CDN緩存

當瀏覽器向CDN節點請求數據時,CDN節點會判斷緩存數據是否過期,若緩存數據并沒有過期,則直接將緩存數據返回給客戶端;否則,CDN節點就會向服務器發出回源請求,從服務器拉取最新數據,更新本地緩存,并將最新數據返回給客戶端。 CDN服務商一般會提供基于文件后綴、目錄多個維度來指定CDN緩存時間,為用戶提供更精細化的緩存管理。
打個比方:

10年前,還沒有火車票代售點一說,12306.cn更是無從說起。那時候火車票還只能在火車站的售票大廳購買,而我所在的小縣城并不通火車,火車票都要去市里的火車站購買,而從我家到縣城再到市里,來回就是4個小時車程,簡直就是浪費生命。后來就好了,小縣城里出現了火車票代售點,甚至鄉鎮上也有了代售點,可以直接在代售點購買火車票,方便了不少,全市人民再也不用在一個點苦逼的排隊買票了。

簡單的理解CDN就是這些代售點(緩存服務器)的承包商,他為買票者提供了便利,幫助他們在最近的地方(最近的CDN節點)用最短的時間(最短的請求時間)買到票(拿到資源),這樣去火車站售票大廳排隊的人也就少了。也就減輕了售票大廳的壓力(起到分流作用,減輕服務器負載壓力)。

用戶在瀏覽網站的時候,CDN會選擇一個離用戶最近的CDN邊緣節點來響應用戶的請求,這樣海南移動用戶的請求就不會千里迢迢跑到北京電信機房的服務器(假設源站部署在北京電信機房)上了。

3. http緩存

簡書http緩存
實踐這一次,徹底搞懂瀏覽器緩存機制
在這里插入圖片描述

  • 只緩存get請求相應的資源
  • 緩存是從第二次請求開始
  • 第一次請求資源時,服務器返回資源,并在響應頭中回傳資源的緩存參數
  • 第二次請求時,瀏覽器判斷這些請求參數
  • Cache-Control': 'max-age=300'在服務端設置
  • js設置 <head> 里的<meta>標簽
  • Cache-Control的默認值就是no-cache(需要進行協商緩存)
  • HTTP中并沒有指定如何生成ETag,哈希是比較理想的選擇。(在服務器端實現中,很多情況下并不會用哈希來計算ETag,這會嚴重浪費服務器端資源,很多網站默認是禁用ETag的)
  • 思考:多服務器時,INode不一樣,所以不同的服務器生成的ETag不一樣,所以用戶有可能重復下載(這時ETag就會不準),明白了上面的原理和設置后,解決方法也很容易,讓ETag后面 二個參數,MTime和Size就好了。只要ETag的計算沒有INode參于計算,就會很準了。
  • 關于ETAG的工作原理
  • 使用 Last-Modified 的問題在于它的精度在秒(s)的級別,比較適合不太敏感的靜態資源。
  • 思考,這幾個參數怎么配合使用 ?
3.1 三級緩存原理 (訪問緩存優先級)
  1. 先在內存中查找,如果有,直接加載。
  2. 如果內存中不存在,則在硬盤中查找,如果有直接加載。
  3. 如果硬盤中也沒有,那么就進行網絡請求
  4. 請求獲取的資源緩存到硬盤和內存。
3.2 強緩存(有沒有過期)
  1. Expires:這個時間代表著這個資源的失效時間,在此時間之前,即命中緩存。這種方式有一個明顯的缺點,由于失效時間是一個絕對時間,所以當服務器與客戶端時間偏差較大時,就會導致緩存混亂。
  2. Cache-Control:它是一個相對時間,例如 Cache-Control:max-age=3600,代表著資源的有效期是 3600 秒。
    • no-cache:需要進行協商緩存,發送請求到服務器確認是否使用緩存。
    • no-store:禁止使用緩存,每一次都要重新請求數據。
    • public:可以被所有的用戶緩存,包括終端用戶和 CDN 等中間代理服務器。
    • private:只能被終端用戶的瀏覽器緩存,不允許 CDN 等中繼緩存服務器對其緩存。

Cache-Control 與 Expires 可以在服務端配置同時啟用,同時啟用的時候 Cache-Control 優先級高。

3.3 協商緩存(有沒有變化)
  1. Last-Modify(服務器)/If-Modify-Since(瀏覽器)
  • 瀏覽器第一次請求一個資源的時候,服務器返回的 header 中會加上 Last-Modify,Last-modify 是一個時間標識該資源的最后修改時間。
  • 當瀏覽器再次請求該資源時,request 的請求頭中會包含 If-Modify-Since,該值為緩存之前返回的 Last-Modify。服務器收到 If-Modify-Since 后,根據資源的最后修改時間判斷是否命中緩存。
  1. ETag/If-None-Match:ETag 可以保證每一個資源是唯一的,資源變化都會導致 ETag 變化。

4 localStorage、sessionStorage、cookie的區別,應用場景

17. 瀏覽器輸入網址

  1. 對url地址進行域名解析,解析為ip地址
  2. 本機hosts文件 - 瀏覽器本身DNS緩存 - 本機配置的首選DNS服務器(ip地址)
  3. 瀏覽器向服務器發起tcp連接,三次握手
  4. 瀏覽器發送請求報文(請求行、請求頭、空行、請求體)
  5. 服務器響應數據
  6. 渲染頁面
    html解析->外部樣式、腳本加載->外部樣式執行(CSSOM樹)->外部腳本執行->html繼續解析->DOM樹構建完成->CSSOM + DOM繪制Render Tree-> 頁面的重排、重繪 ->加載圖片->頁面加載完成。

若在HTML頭部加載JS文件,由于JS阻塞,會推遲頁面的首繪。為了加快頁面渲染,一般將JS文件放到HTML底部進行加載,或是對JS文件執行async或defer加載

拓展5:
在這里插入圖片描述
請求報文頭中,accept代表客戶端希望接受的數據類型,這是瀏覽器自動封裝的請求頭。如果服務器返回的content-type是accept中的任何一個(比如text/html ),瀏覽器都能解析,并直接展示在網頁上。如果服務器返回的content-type是其他類型,此時瀏覽器有三種處理狀態:
8. 正常顯示。例如返回類型為text/javascript,瀏覽器能直接處理并展示
9. 下載。例如返回類型為application/octet-stream(二進制流,不知道下載文件類型),這種瀏覽器不能直接處理的,會被下載。
10. 報錯。當我們返回一個字符串hello world,卻使用text/xml,格式時,瀏覽器不能正確解析,就會報錯,并把報錯信息呈現在網頁中。

瀏覽器能直接處理很多種格式,并直接呈現在網頁中,并不限于accept中規定的字段,具體有哪些,就需要自己親自動手試試了。

18. data為什么要作為方法返回

data的值是一個對象, 是引用數據類型,如果不用函數return ,每個組件的data 都是同一個對象,一個數據改變了其他也改變了;

所以為了不讓多處的組件共享同一data對象,只能返回函數。這都是因為js本身的特性帶來的,跟vue本身設計無關。

19. nginx(輕量級占用更少內存,支持更多的并發連接)、 apache區別

Apache和Nginx在應用中如何選擇?

  • 一般訪問量網站優先使用Apache,穩定可靠。
  • Apache模塊非常豐富,為了用它的模塊選它。
  • Apache的rewrite非常強大,rewrite多就選它。
  • 大訪問量優先使用Nginx,支持更多的并發連接。
  • 處理的都是靜態資源(圖片 html),首選Nginx(Nginx定位于靜態資源分發,反向代理,在處理靜態資源更有優勢)
  • 需要反向代理使用Nginx。

20. websocket(持久化、全雙工通訊協議)

1. websocket使用

看完讓你徹底理解 WebSocket 原理

  • ajax輪詢:定時,每隔一段時間問一下
  • 長輪詢:打電話,收到回復才掛斷,并發起新的

服務器有更新時,前端不需要去輪詢(消耗資源),因為瀏覽器可以主動推送消息。
前端代碼:
url:

  • 未加密:ws://
  • 已加密:wss://
if (window.WebSocket) {// wsurl服務器地址websocket = new WebSocket(wsurl);//連接建立websocket.onopen = function (evevt) {......}//收到消息websocket.onmessage = function (event) {var msg = JSON.parse(event.data); //解析收到的json消息數據var umsg = msg.message; //消息文本var uname = msg.name; //發送人......(一些操作:比如顯示消息在對話框)}//發生錯誤websocket.onerror = function (event) {......(一些操作:比如顯示錯誤提示在對話框)}//連接關閉websocket.onclose = function (event) {......}function send() {var name = $('#name').val();var message = $('#message').val();var msg = {message: message,name: name};try {websocket.send(JSON.stringify(msg)); // 復雜的數據結構要先進行序列化} catch (ex) {console.log(ex);}}
}
else {alert('該瀏覽器不支持web socket');
}
  • var 實例 = new WebSocket(url)
  • 實例.onopen = function(event){ }
  • 實例.onmessage = function(event){ }
  • 實例.onerror = function(event){ }
  • 實例.onclose = function(event){ }
  • 實例.send(data) // 向服務器發送消息

2. HTTP 1.0 1.1 2.0

2.1. HTTP 1.0 連接無法復用

瀏覽器的每次請求都需要與服務器建立一個TCP連接,服務器完成請求處理后立即斷開TCP連接。(每次請求都經歷三次握手和慢啟動)在這里插入圖片描述

2.2. HTTP 1.1 持久連接/長連接

在這里插入圖片描述
在這里插入圖片描述

  1. 支持持久連接(HTTP/1.1的默認模式使用帶流水線的持久連接),在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲

  2. HTTP 1.1還允許客戶端不用等待上一次請求結果返回,就可以發出下一次請求,但服務器端必須按照接收到客戶端請求的先后順序依次回送響應結果,以保證客戶端能夠區分出每次請求的響應內容,這樣也顯著地減少了整個下載過程所需要的時間。一旦有某請求超時等,后續請求只能被阻塞,毫無辦法,也就是人們常說的線頭阻塞。

  3. 緩存處理:在HTTP1.0中主要使用header里的If-Modified-Since,Expires(協商緩存/強緩存)來做為緩存判斷的標準,HTTP1.1則引入了更多的緩存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match(協商緩存)等更多可供選擇的緩存頭來控制緩存策略。

  4. 支持斷點續傳 Accept-Ranges : bytes | none (圖片等資源)

  5. HTTP 1.1還提供了與身份認證、狀態管理和Cache緩存等機制相關的請求頭和響應頭。

  6. 在HTTP 1.1中增加Host請求頭字段。
    我們可以在一臺WEB服務器上可以在同一個IP地址和端口號上使用不同的主機名來創建多個虛擬WEB站點。

瀏覽器阻塞(HOL blocking/head of line blocking)
瀏覽器對于同一個域名,一般PC端瀏覽器會針對單個域名的server同時建立6~8個連接,手機端的連接數則一般控制在4~6個(這個根據瀏覽器內核不同可能會有所差異),超過瀏覽器最大連接數限制,后續請求就會被阻塞。HTTP1.0有這個問題。

2.3. HTTP 2.0
  • HTTP/2多個請求可同時在一個連接上并行執行。某個請求任務耗時嚴重,不會影響到其它連接的正常執行
  • 服務端推送

在這里插入圖片描述

21. 軟件開發流程、軟件模型

需求分析-概要設計-詳細設計-程序編碼-程序測試-軟件交付-客戶驗收-碼農維護
增量模型:設計核心功能+逐步累加

22. js處理異步的幾種方式

  1. 回調函數
  2. 事件監聽
  3. promise
  4. async/await

23. vue3

24. 版本迭代時,修復bug,使用git是一個怎樣的過程

25. 閉包的實際應用,除了閉包還有什么內存泄漏的情況

  • 閉包用來封裝變量,收斂權限。
  • 利用閉包可以給對象設置私有屬性并利用特權(Privileged)方法訪問私有屬性。
  • 如果外界想訪問secret變量,只能通過我定義的函數get_secret來進行訪問,用new_secret進行設置。外界能做的就只是使用我的函數,然后傳幾個不同的參數罷了。
    在這里插入圖片描述

26. 怎么判斷一個頁面加載完了

  1. window.onload【頁面包含圖片等文件在內的所有元素都加載完成】
    當一個文檔完全下載到瀏覽器中時,才會觸發window.onload事件。這意味著頁面上的全部元素對js而言都是可以操作的,也就是說頁面上的所有元素加載完畢才會執行。這種情況對編寫功能性代碼非常有利,因為無需考慮加載的次序。
  2. jQuery的ready方法【表示文檔結構已經加載完成(不包含圖片等非文字媒體文件)】
    會在DOM完全就緒并可以使用時調用。雖然這也意味著所有元素對腳本而言都是可以訪問的,但是,并不意味著所有關聯的文件都已經下載完畢。換句話說,當HMTL下載完成并解析為DOM樹之后,代碼就會執行。
$(document).ready(function(){dosth//你要做的事情
})
  1. document.onreadystatechange
document.onreadystatechange = function()   //當頁面加載狀態改變的時候執行function{ if(document.readyState == "complete"){   //當頁面加載狀態為完全結束時進入 init();   //你要做的操作。}}

27. 頁面加載優化、加載圖片優化

頁面加載優化

  1. 精靈圖

  2. 使用外部的JavaScript和CSS(瀏覽器就有可能緩存它們,從而在以后加載的時候能夠直接使用緩存,而HTML文檔的大小減小,從而提高加載速度)

  3. 樣式表放在頭部(頁面內容逐步呈現,改善用戶體驗,防止“白屏”)、腳本放在底部(js的下載和執行會阻塞Dom樹的構建)

  4. 壓縮CSS和JavaScript【移除不必要的字符(如TAB、空格、回車、代碼注釋等)】

  5. 壓縮:客戶端可以通過HTTP請求中的Accept-Encoding頭來表示對壓縮的支持Accept-Encoding: gzip 服務器看到請求中有這個頭,就會使用客戶端列出來的方法中的一種來進行壓縮。Web服務器通過響應中的Content-Encoding來通知 Web客戶端。
    Content-Encoding: gzip

  6. 瀏覽器緩存

  7. cdn(將整個站點的靜態資源放到一個專門的域名下,以求減小網絡開銷)


加載圖片優化

28. get/post有什么區別

GETPOST
回退時是無害的再次提交請求
可以被收藏不能被收藏
請求參數會被完整保留在瀏覽器歷史記錄里不保留參數
參數是有長度限制的參數無限
更不安全 暴露參數更安全
參數通過URL傳遞request body
參數的數據類型,GET只接受ASCII字符無限制
GET請求會被瀏覽器主動cachePOST不會,除非手動設置

29. 前端請求時參數錯誤狀態碼400

請求沒有進入后臺服務器里

原因: (1)前端提交的字段名稱或者字段類型和后臺的實體類不一樣或者前端提交的參數跟后臺需要的參數個數不一致,導致無法封裝

(2)前端提交到后臺的數據應該是JSON字符串類型,而前端沒有將對象轉化為字符串類型;

解決方法: 對照字段名稱,類型保證一致

30. 同源策略具體要解決什么安全問題

31. http2.0

32.前端優化

  • 從外部引入css、js,對優化有什么幫助?
  • 當我們瀏覽網頁的時候,在客戶端這邊都會有頁面的緩存文件。在我們訪問這一個頁面的時候,客戶端就會下載css和js文件到本地。其實區別就在這里,當我們訪問完這一頁面,再去訪問網站其他頁面,頁面就會重新加載一次。如果我們將css樣式和js腳本寫到html網頁當中,那么它將每次都得重新加載一次這些css樣式和js腳本。但是,通過外部引入的方式導入css文件和js文件則不同,因為之前訪問頁面的時候客戶端已經下載js文件和css文件到本地,所以再次訪問頁面的時候就會判斷不會再次下載這個文件,也就是說訪問頁面的時候對于css,js靜態文件如果未修改過頁面在刷新或者其他頁面引用的相同路徑的文件的時候會直接用緩存,不需要再次從服務器下載。這樣就減少了網頁載入的速度,因為更利于網頁的優化。
  • 使用精靈圖,如果圖片很大呢?
  • 博客園精靈圖使用注意事項
  • 請求的次數越少越好嗎?如果和之前同域的情況下,沒有耗費
  • 精靈圖,為什么能更快呢?
  • 所有的js都放下面嗎?如果頁面依賴這個js呢?
  • 304具體的交互流程,什么情況下產生的304

33. 設計模式-單例模式

34. 操作系統里進程和線程的區別

35. 死鎖及發生死鎖的條件

36. 32位的機器最大能承載多大的內存

37. https怎么驗證ca證書,如果黑客獲取證書呢?

38. 組件復用

39. 閉包的應用場景,一定會用到閉包


筆試題

1. select下拉列表

在這里插入圖片描述
在這里插入圖片描述

  1. 下拉列表屬性
    selected(默認選中)
    autocomplete
    autofocus(規定下拉列表在頁面加載時自動獲得焦點)
    disabled
    select對象
    selectedIndex
    option對象

  2. js事件

//js事件
οnchange="fun(this.options[this.options.selectedIndex].text)"
//獲取文本的值
this.options[this.options.selectedIndex].text  是文本的值
//獲取value的值
this.options[this.options.selectedIndex].value 是value值
<select autocomplete="off"><option value="郵件" selected="selected">郵件</option><option value="FTP">FTP</option><option value="TELNET">TELNET</option>
</select>
  1. 運用new Option(“文本”,“值”)方法添加選項option
var obj = document.getElementById("mySelect");
obj.add(new Option("4","4")); 
  1. 刪除所有選項options
var obj = document.getElementById("mySelect");
obj.options.length = 0; 
  1. 刪除選中選項option
var obj = document.getElementById("mySelect");
var index = obj.selectedIndex;
obj.options.remove(index);
  1. 刪除select
var obj = document.getElementById("mySelect");
obj.parentNode.removeChild(obj); //移除當前對象 
  1. 修改選中選項option
var obj = document.getElementById("mySelect");
var index = obj.selectedIndex;
obj.options[index] = new Option("three",3); //更改對應的值
obj.options[index].selected = true; //保持選中狀態

2. 使圖片具有”提交”按鈕同樣的功能

直接使用< input type=“image”>即可,此標簽放置在標簽內就具有提交功能,如果不在< form>標簽內,則可以使用< input type=“image” onClick = “formName.submit()”>方式提交。

說明:
INPUT type=image 元素 | input type=image 對象
創建一個圖像控件,該控件單擊后將導致表單立即被提交。

3. javascript進行表單驗證的目的是

b)檢查提交的數據必須符合實際

4. class不屬于javascript關鍵字

5. [‘1’,‘2’, ‘3’].map(parseInt)

['1','2', '3'].map(parseInt)
(3) [1, NaN, NaN]

由于map的回調函數的參數index索引值作了parseInt的基數radix,導致出現超范圍的radix賦值和不合法的進制解析,才會返回NaN。
parseInt(string, radix)

參數描述
string必需。要被解析的字符串。
radix可選。表示要解析的數字的基數。該值介于 2 ~ 36 之間。如果省略該參數或其值為 0,則數字將以 10 為基礎來解析。如果它以 “0x” 或 “0X” 開頭,將以 16 為基數。如果該參數小于 2 或者大于 36,則 parseInt() 將返回 NaN。

6. pixelTop和top

都不是Location對象的屬性

pixelToptop
返回像素為單位的位置坐標的數值返回帶單位的位置坐標字符串

在這里插入圖片描述

7. 正則

  • +號代表前面的字符必須至少出現一次(1次或n次)
  • * 號代表字符可以不出現,也可以出現一次或者多次(0次、或1次、或多次)
  • ?問號代表前面的字符最多只可以出現一次(0次、或1次)
  • $匹配輸入字符串的結尾位置。如果設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,請使用 $。
  • *、+ 限定符都是貪婪的,因為它們會盡可能多的匹配文字,只有在它們的后面加上一個?就可以實現非貪婪或最小匹配。
    | 符號 |含義 |
    |–|--|
    | + |1~n {1,} |
    | * |0~n {0,}|
    | ? |0或1 {0,1} |
    |^ | 開始 |
    | $ | 結尾 |
    | \ |轉義 |
    | ( )| 子表達式|
    | .| 除換行符 \n 之外的任何單字符|
    | | | 兩項之間的一個選擇 |
    |{n} | 匹配確定的 n 次|
    | {n,}|至少匹配n 次 |
    |{n,m} | 最少匹配 n 次且最多匹配 m 次|
    | \b| 匹配一個單詞邊界,即字與空格間的位置。|
    | \B| 非單詞邊界匹配|
    | \1 |指定第一個子匹配項 |
    |g | 將該表達式應用到輸入字符串中能夠查找到的盡可能多的匹配|
    | i| 不區分大小寫|
    | [xyz]|匹配所包含的任意一個字符 |
    | \d| 匹配一個數字字符 |
    |\D | 匹配一個非數字字符。等價于 [^0-9]|
    | \s| 匹配任何空白字符,包括空格、制表符、換頁符等等 |
    |\S | 匹配任何非空白字符|
    |\w |匹配字母、數字、下劃線。等價于’[A-Za-z0-9_]’。 |
    | \W| 匹配非字母、數字、下劃線。等價于 ‘[^A-Za-z0-9_]’。 |

匹配<img src = "http://image.163.com" ></img>的正則

<img src="[^"]*" ></img>

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251302.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251302.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251302.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

http --- 用于HTTP調試的最小型Perl Web 服務器

下面的程序是個很有用戶的診斷工具,可以用來調試與客戶端和代理的交互情況. 該程序 首先會等待HTTP連接,只有收到請求報文,就會將報文打印在屏幕上,然后等待用戶輸入一條響應報文,并將其回送給客戶端. #! /usr/bin/perl use Socket; use Carp; use FileHandle;# (1) use prot …

Mysql - 安裝與配置

1、下載安裝包 > https://www.mysql.com/downloads/ 2、雙擊安裝&#xff0c;點擊Install MySQL Products > 3、Skip 打鉤&#xff0c;Next下一步 > 4、選擇Server only&#xff1a;只選擇安裝服務端&#xff0c;根據個人喜好更改安裝路徑和數據保存路徑…

4084:拓撲排序

題目鏈接&#xff1a;http://bailian.openjudge.cn/practice/4084/ 總時間限制: 1000ms 內存限制: 65536kB描述給出一個圖的結構&#xff0c;輸出其拓撲排序序列&#xff0c;要求在同等條件下&#xff0c;編號小的頂點在前。 輸入若干行整數&#xff0c;第一行有2個數&#xff…

廖雪峰git教程學習

廖雪峰git教程 git – Linus在2周內用c寫的 1.1 基本概念 版本控制系統&#xff0c;追蹤文本文件的改動&#xff0c;文件、視頻等二進制文件則不可追蹤&#xff08;微軟的word也是二進制文件&#xff09;HEAD 指向當前分支&#xff0c;表示當前版本&#xff08;最新的提交&am…

操作系統 --- 進程和管程的不同

1.進程定義的是私有數據結構PCB,管程定義的是公共數據結構,如消息隊列等; 2.進程是由順序程序執行有關操作,而管程主要是進行同步操作和初始化操作; 3.設置進程的目的在于實現系統的并發行,而管程的設置則是解決共享資源的互斥使用問題; 4.進程通過調用管程中的過程對共享數據結…

JCO 自定義DestinationDataProvider

要讓JAVA程序能訪問SAP系統&#xff0c;一般通過SAP JCO接口進行通訊&#xff0c;在獲取到SAP的連接時需求提供一些連接參數&#xff0c;這些參數在最新的 JCO 3.0 中需要被保存到一個帶有擴展名.jcoDestination的文件中&#xff0c;這個文件同時被保存在應用程序的安裝目錄中。…

android BLE Peripheral 手機模擬設備發出BLE廣播 BluetoothLeAdvertiser

android 從4.3系統開始可以連接BLE設備&#xff0c;這個大家都知道了。iOS是從7.0版本開始支持BLE。android 進入5.0時代時&#xff0c;開放了一個新功能&#xff0c;手機可以模擬設備發出BLE廣播&#xff0c; 這個新功能其實是 對標于 iOS系統的手機模擬iBeacon設備。先介紹一…

前端后臺管理系統梳理

再梳理一遍 一、商品后臺管理系統 1. 功能 1.1 服務端情況 開啟了CORS跨域支持需要授權的 API &#xff0c;必須在請求頭中使用 Authorization 字段提供token 令牌&#xff08;axios攔截器&#xff09;baseUrl&#xff0c;接口地址&#xff1a;http://localhost:8888/api/…

操作系統 --- 使用套接字進行網絡通信

一個套接字就是一個通信標識類型的數據結構,包含了通信目的的地址、通信使用的端口號、通信網絡的傳輸協議、進程所在的網絡地址,以及針對客戶或服務器程序提供的不同系統調用等,是進程通信和網絡通信的基本構件。套接字是為客戶/服務器模型而設計的,通常分為以下兩類: 1.基于…

構造器執行順序

轉載于:https://www.cnblogs.com/a6948076/p/8045801.html

Java08-java語法基礎(七)構造方法

Java08-java語法基礎&#xff08;七&#xff09;構造方法 一、構造方法 1、什么是構造方法&#xff1f; 構造方法&#xff08;類方法&#xff09;是一個方法名和類名相容的特殊的成員方法。 2、構造方法的作用&#xff1f; 當使用new關鍵字創建一個對象時&#xff0c;為新建對象…

安裝mysql8.0.20,報錯“找不到VCRUNTIME140_1.dll”

寫在最前&#xff0c;指令集合 以管理員身份運行cmd mysql -uroot -p 【進入】mysql mysql > exit 【退出】 net stop mysql 【暫停】 net start mysql 【啟動】 mysql -u root -p&#xff08;命令后輸入臨時密碼&#xff0c;進入mysql&#xff09; ALTER USER USER() …

操作系統 --- 線程與進程的比較

如果說,在操作系統中引入進程的目的是為了使多個程序能并發執行,以提高資源利用率和系統吞吐量,那么在操作系統中再引入線程,則是為了減少程序在并發執行時所付出的時空開銷,使OS(操作系統)具有更好的并發性… 我們再回顧一下進程的兩個基本屬性: 1.進程是一個可擁擁有資源的獨…

24種吸引人的營銷文章標題寫法,總有一個適合你!

在如今信息爆炸的互聯網時代下&#xff0c;如何提高提高文章的閱讀(新聞稿、軟文宣傳稿、微信公眾號)&#xff0c;成為從業者們共同研究的課題?首先你得有一個足夠吸引的標題&#xff0c;尤其是定向推送的時候&#xff0c;這將是由一個質變帶來量變的過程。小編雖然不提倡標題…

[js] 處理字符串換行造成的json解析失敗

需求&#xff1a;從數據庫某個字段取出字符串出來&#xff0c;轉為json&#xff0c;結果發現報錯為 解析失敗&#xff0c;發現是因為取出的字符串換行導致&#xff0c;現在需要將字符串里面的換行替換為&#xff0c;使字符串可依成功解析成json對象。 技術&#xff1a;依靠repl…

使用mockjs模擬數據

一、安裝 簡單粗暴 npm install mockjs 二、引入 CommonJS引入 let Mock require(mockjs) let userInfo Mock.mock({data: {responseCode: 200,responseMessage: success,userMessage: {name: "cname",email: "email",msg: cparagraph(2)}} })或者ES…

angular --- ngDialog關閉當前層

今天做項目,使用ngDialog 彈出了一層,并且在彈出層上又彈出了第二層. 現在想點擊確定按鈕關閉第二層. 使用以前的ngDialog.close()會關閉掉全部ngDialog.open方法彈出來的層. 在網上查了一堆,找了好多,最后發現就一句話.$scope.closeThisDialog(); 注意, 要在controller:中傳遞…

lodash源碼分析之compact中的遍歷

小時候&#xff0c; 鄉愁是一枚小小的郵票&#xff0c; 我在這頭&#xff0c; 母親在那頭。 長大后&#xff0c;鄉愁是一張窄窄的船票&#xff0c; 我在這頭&#xff0c; 新娘在那頭。 后來啊&#xff0c; 鄉愁是一方矮矮的墳墓&#xff0c; 我在外頭&#xff0c; 母親在里頭。…

[HAOI2008]移動玩具

這又是一道神奇的搜索題。。。只要記錄每種狀態。。。然后暴力判斷這種狀態往后一步的情況。。。 廣搜出最優解即可。。。 呆碼&#xff1a; #include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std;int dx[5]{0…

javascript --- Sortable一個拖拽的接口

最近項目里面要實現需要實現一個拖拽功能,自己實現很麻煩,就在網上找到了一個封裝好的sortable函數,github(https://github.com/SortableJS/Sortable). 首先是依賴的引入:(也可以自己下載源代碼導入,方式很多呢) <body><!-- Latest compiled and minified CSS -->…