2021前端面試題

  • 基礎知識與素養
  • JS基本功訓練與思考
  • 程序設計的滲透與應用
  • 業務技巧的積累與訓練
  • 生產力轉換
  • 項目的組織架構
  • 轉換專業人才的全面生產力

什么樣的技術水平決定了你應該學習什么樣的知識與技術,什么樣的知識與技術水平決定了你到什么樣的公司,到什么樣的公司決定了你在什么樣社會層次,什么樣的社會層次決定了你的眼界與發展的高度。

試題來源

一 面試題:

0、*浮動的影響

① 浮動元素不占位,脫離文檔流,可以達到文字環繞的排版效果,也會引起標準流div被浮動元素遮擋
② 父元素高度塌陷

1、*BFC:解決因為浮動引起的問題 BFC

1)觸發BFC的條件

① body元素
② float非none的
③ 絕對定位的(position:fixed/absolute)
④ display: flex/inline-block/table-cells
⑤ overflow非visible

2)BFC的特性

同一BFC內margin折疊

3)BFC的作用

① 清除浮動(解決父元素高度塌陷)
② 解決元素被浮動元素覆蓋(可用于做左右兩列布局,左寬度固定,右自適應)

2、*完整的web請求(返回了html)瀏覽器訪問地址

3、*頁面渲染HTML過程

在這里插入圖片描述

4、*get、post請求的區別,解釋get請求可以被緩存(瀏覽器決策)、不想緩存如何做:

1)在ajax發送請求前加上xmlHttpRequest.setRequestheader(‘Cache-Control’,“no-cache”) 或者請求頭(“if-Modified-Since”:“0”)
2)在服務端加 header("cache-Control:no-cache,must-revalidate)
3)增加一個唯一值的參數:一般是使用timestamp = new Date().getTime() (推薦)
(場景:請求服務器資源,如下載文件,文件更新時)

5、下載文件,window.open、download屬性依然不下載(必須同源)

6、反向代理是什么、作用

1)反向代理

反向代理(Reverse Proxy)方式是指:代理服務器來接受 Internet 上的連接請求,然后將請求轉發給內部網絡上的服務器,并將從內部網絡上服務器得到的結果返回給 Internet 上請求連接的客戶端。此時代理服務器對外就表現為一個服務器,反向代理服務器對于客戶端而言它就像是原始服務器,并且客戶端不需要進行任何特別的設置。
反向代理的作用:
保證內網的安全,可以使用反向代理提供 WAF 功能,阻止 web 攻擊
負載均衡,通過反向代理服務器來優化網站的負載。

7、**vue項目性能優化(小野森森)

  1. vue-for為什么要加key(更快定位數據與diff)
  2. 模塊化、組件化(封裝高度復用性的模塊:http、拆分高度復用性的組件、組件可配置性強)
  3. 路由懶加載/動態加載組件 :首屏加快渲染
  4. productionSourceMap設置false:否則,生產map文件,打包后體積變大,且能定位源碼(泄漏源碼邏輯)【在bulid/config/index文件下】
  5. productionGzip設置true:gzip壓縮、打包體積更小
  6. keep-alive:緩存組件,用keep-alive包裹router-view
  7. 插件CDN:vue-router、axios可以用link方式引入到html中,并在configureWebpack里注冊,減少打包(也可以將這些js、css文件下載,放在自己的CDN、以防官方服務器掛了)
  8. 圖片CDN、圖片懶加載(vue-lazyLoad插件,v-lazy指令)、使用CSS圖標(在main.js里全局引入iconfont字體圖標)
  9. 組件按需導入: import { Button, Input } from ‘element-ui’

8、**webpack打包工具 (小野森森)【考配置流程、loader的作用】

1、作用①:壓縮代碼,混淆js代碼;
2、作用②:瀏覽器不支持ES5以上的語法,webpack可以安裝一系列依賴包將之翻譯成ES5
3、作用③:將less、sass編譯成css
4、所需依賴:

  1. 【三大件】webpack、webpack-cli(腳手架)、webpack-dev-server(開發者服務器插件)
  2. 【六件套】處理ES6 ES7… 裝飾器:
    . babel-loader@7、babel-core、babel-preset-env
    . babel-plugin-transform-runtime
    . babel-plugin-transform-decorators、 babel-plugin-transform-decorators-legacy
  3. 【四大件】處理樣式sass:
    . sass-loader、node-sass、css-loader、style-loader ( postcss-loader autoprefixer )
  4. 處理模板:ejs-loader
  5. 處理HTML: html-webpack-plugin

5、安裝指令:

  • –save-dev 簡寫 -D (安裝在開發環境下的,線上不跑)
  • –save 簡寫 -S (安裝在生成環境下的)

6、配置安裝包 webpack.config文件
特*:所有plugin結尾的依賴,一般要require導入、babel則不用
plugins: [ new HtmlWebpackPlugin( { } ) ]
7、 用命令跑配置文件webpack.config,在package.json的script里(跑腳本)

9、***Promise(小野森森)

引子:一個高階函數(參數里有函數),返回一個fn,在fn里有條件的執行回調方法(閉包)

const doSth = (t) => {return () => {if (--t === 0) {print1(() => {print2(() => {print3()})})}}
}
const print1 = (cb) => {console.log('第一次打印')// 打印出這句話后執行cbcb()
}
const print2 = (cb) => {console.log('第二次打印')cb()
}
const print3 = () => {console.log('第三次打印')
}
const fn = doSth(3, print1)
fn()
fn()
fn()

1. 基本

目的:需要處理異步請求的嵌套,比如,先根據接口判斷是否重復,拿到res后再進行下一次請求
① Promise是解決異步流程化的手段,Promise不是異步
② Promise是構造函數,需要new
③ Promise的唯一參數,executor函數,有參數resolve、reject
executor在new Promise的時候調用
⑤ executor是同步執行的,而then是異步調用的
⑥ 每個返回的Promise都有一個then方法,方法有2個回調函數cb,第一個cb的參數需由resolve執行時傳入,resolve時執行第一個cb,reject時執行第二個cb
沒有第二個callback的時候可以通過.catch,優先走then里的第二個cb,且無論是第幾個then,總是優先于catch
⑧ reject能做的,throw new Error也可以
⑨ 每個then可以再繼續.then下去 (在第一個Promise里返回Promise)

⑤ ↓

let promise = new Promise((resolve, reject) => {console.log(1)reject(3)
})
promise.then((res) => {console.log('打印', res)
}, (err) => {console.log(err)
})
console.log(2)
// 打印 1 2 3

⑥ ↓

let promise = new Promise((resolve, reject) => {resolve('結果')
})
promise.then((err) => {console.log('打印', err)
})
// 打印 結果
let promise = new Promise((resolve, reject) => {reject('服務異常')
})
promise.then((res) => {console.log('打印', res)
}, (err) => {console.log(err)
})
// 服務異常

⑦ ↓

let promise = new Promise((resolve, reject) => {reject('服務異常')
})
promise.then().catch((err) => {console.log(err)
})
// 服務異常
let promise = new Promise((resolve, reject) => {reject('服務異常')
})
promise.then(() => { }, (err) => {console.log('優先then', err)
}).catch((res) => {console.log(res)
})
// 優先then 服務異常
let promise = new Promise((resolve, reject) => {reject('服務異常')
})
promise.then(() => { }).then().then(() => { }, (err) => {console.log('無論第幾個then,總是優先', err)
}).catch((res) => {console.log(res)
})
// 無論第幾個then,總是優先 服務異常

⑧ ↓

let promise = new Promise((resolve, reject) => {throw new Error('拋出錯誤')
})
promise.then(() => { }).then().then(() => { }, (err) => {console.log('無論第幾個then,總是優先', err)
}).catch((err) => {console.log(err)
})
let promise = new Promise((resolve, reject) => {throw new Error('拋出錯誤')
})
promise.then(() => { }).catch((err) => {console.log(err)
})

在這里插入圖片描述
⑨ ↓

let promise = new Promise((resolve, reject) => {resolve('結果1')
})
promise.then((res) => {console.log('打印', res)return new Promise((resolve, reject) => {resolve('結果2')})
}).then((res) => {console.log('打印', res)
})
// 打印 結果1
// 打印 結果2

2. 語法糖Promise.resolve Promise.reject

相當于是 new Promise(…)

let promise = new Promise((resolve, reject) => {resolve('結果1')
})
promise.then((res) => {console.log('打印', res)return Promise.resolve('成功啦')
}).then((res) => {console.log(res)
})
// 打印 結果1
// 成功啦

3. Promise.all(通常用于等待多個異步任務完成)

① Promise.all接收iterable類型數據(如Array、Set、Map),數據的每一項可以是Promise也可以不是
② 返回值是Promise,因此可以.then。 如果resolve,則將iterable的每個Promise resolve的data依次放入數組
若參數為空數組,返回空數組
只要其中一個Promise的狀態rejected了,整個Promise.all的狀態便rejected,失敗的原因是第一個失敗的Promise的結果
⑤ 使用場景:一個頁面初始化需要請求多個接口,只要任何一個接口失敗,便認為初始化是失敗的,需要重新請求

4. Promise.race

① 誰先完成,就只返回那個Promise的結果,且無論成功或失敗,都會返回
② 若參數為空數組,Promise.race的結果永遠處于pending狀態,看起來是什么都沒返回
③ 可以比較資源或接口的響應速度

5. async、await

① await是一個操作符,她等待一個Promise對象產出結果,如果這個結果是rejected,就會拋出異常
② async函數返回一個pending狀態,這本身并沒有什么意義

10、***函數防抖與節流小野森森

1、函數防抖

1)含義:

① 延遲執行(時間被觸發n秒后再執行的回調)
② 如果在n秒內再次觸發,則重新開始計時

2)場景:

① ajax請求數據(比如下拉刷新、首次延遲)
② ajax提交數據(提交、支付等按鈕重復點擊、首次不延遲)
③ 表單校驗(input輸入時,延遲驗證,首次也延遲)否則可能無法得到校驗通過的結果

3)實現:

① clearTimeOut的返回值是計時器id,此時t還有值 只有t = null,t才會變成null
② 這里不要亂用箭頭函數
③ 不要debugger調試
④ 思路:考慮首次不延遲的情況→沒有定時器則為首次,因此time后要t = null
(time內頻繁觸發,計時器會頻繁重新開始計時)

domObj.onclick = debounce(myFn)
const myClick = () => {console.log('tag', Date.now())
}
var debounce = function (fn, time, triggleNow) {var t = null // 只有第一次點擊會走這里var debounced = function () {var _self = this,args = arguments;if (t) {console.log('t0', t)clearTimeout(t)// 清除定時器后,t的值還在 // 除非賦值null,否則隨著點擊次數而增加}console.log('t1', t)if (triggleNow) {var exec = !tconsole.log('t2', t)t = setTimeout(function () {t = null}, time)// 到這里 t必有idconsole.log('t3', t)if (exec) {fn.apply(_self, args)}} else {console.log('t4', t)t = setTimeout(function () {fn.apply(_self, args)}, time)}}debounced.remove = function () {clearTimeout(t)t = null}return debounced}
const box = document.getElementsByClassName('box')[0]
box.onclick = debounce(myClick, 1000, true)

表單輸入

const oInput = document.getElementById('input')
const myCheck = function () {var val = this.valueif (val.length < 6) {console.log('校驗失敗')} else {console.log('校驗成功')}
}
oInput.onkeyup = debounce(myCheck, 1000, true)
// 只會打印校驗失敗,之后即使長度滿足了,由于在time內頻繁鍵入,也不會再觸發了

若函數有返回值

var debounce = function (fn, time, triggleNow) {var t = null,res// console.log('t', t)// time內多次點擊,只有初次會走這里var debounced = function () {var _self = this,args = arguments;if (t) {console.log('t0', t)clearTimeout(t)// 清除定時器后,t的值還在 // 除非賦值null,否則隨著點擊次數而增加}console.log('t1', t)if (triggleNow) {var exec = !tconsole.log('t2', t)t = setTimeout(function () {t = null}, time)// 到這里 t必有idconsole.log('t3', t)if (exec) {res = fn.apply(_self, args)}} else {console.log('t4', t)t = setTimeout(function () {res = fn.apply(_self, args)}, time)}return res // 假若函數有返回值}debounced.remove = function () {clearTimeout(t)t = null}return debounced}

2、 函數節流

1)含義場景:

事件被觸發、n秒內只且必執行一次事件處理函數 ,可用于輸入驗證、ajax提交

2) 實現:

function throttle(fn, delay) {// 閉包var t = null,begin = new Date().getTime()return function () {var _self = this,args = arguments,cur = new Date().getTime()clearTimeout(t)if (cur - begin >= delay) {console.log(1)// 隔了很久后再在原來基礎上輸入,會先走1,再走2fn.apply(_self, args)begin = cur} else {console.log(2)t = setTimeout(function () {fn.apply(_self, args)}, delay)}}
}

對比:
n秒內頻繁觸發,永遠不讓執行,用函數防抖
n秒內頻繁觸發,有且執行一次,用函數節流

11、 事件循環

① 消息隊列/任務隊列/事件隊列是一樣的,即異步任務相關的隊列(先進先出/排隊)
② 異步任務有:(隊列中的消息對應著事件,因此叫事件循環,循環讀取消息隊列)

  1. 普通事件:click、resize → DOM操作對應DOM事件
  2. 資源加載:load、error → 資源加載操作對應加載事件
  3. 定時器:setInterval、setTimeout

③ 詳細步驟:

  1. 所有同步任務都在主線程上執行,形成一個執行棧
  2. 主線程之外,還存在一個"消息隊列"。只要異步操作執行完成,就到消息隊列中排隊
  3. 一旦執行棧中的所有同步任務執行完畢,系統就會按次序讀取消息隊列中的異步任務,于是被讀取的異步任務結束等待狀態,進入執行棧,開始執行
  4. 主線程不斷重復上面的第三步

從代碼執行順序的角度來看,程序最開始是按代碼順序執行代碼的,遇到同步任務,立刻執行;遇到異步任務,則只是調用異步函數發起異步請求。此時,異步任務開始執行異步操作,執行完成后到消息隊列中排隊。程序按照代碼順序執行完畢后,查詢消息隊列中是否有等待的消息。如果有,則按照次序從消息隊列中把消息放到執行棧中執行。執行完畢后,再從消息隊列中獲取消息,再執行,不斷重復。

12、宏任務、微任務

① 微任務早于宏任務
② 多個定時器(內含同步、微任務),按定時器順序完整執行完
在這里插入圖片描述

13、this指向

1:this永遠指向一個對象;
2:this的指向完全取決于函數調用的位置
針對以上的第一點特別好理解,不管在什么地方使用this,它必然會指向某個對象;確定了第一點后,也引出了一個問題,就是this使用的地方到底在哪里,而第二點就解釋了這個問題,但關鍵是在JavaScript語言之中,一切皆對象,運行環境也是對象,所以函數都是在某個對象下運行,而this就是函數運行時所在的對象(環境)。

11、****設計模式

1)單例模式

12、***原型鏈

13、***閉包

14、****事件循環

15、**vue路由模式、前端單頁面路由跳轉實現的原理是什么

1、Vue模板編譯(小野森森)

11、Vue2、3的區別(小野森森)

  1. vue2.0:options API (低內聚)
  2. vue3.0:可以將方法提出來
    在這里插入圖片描述

12、**call、bind、apply

  • 改變this指向(第一個參數)
  • 只有applay的參數是數組
  • 只有bind返回的是函數
    案例
const doSth = (t, cb) => {return () => {if (--t === 0) {cb()}}
}
const print1 = (cb) => {console.log('第一次打印')// 打印出這句話后執行cbcb()
}
const fn = doSth(3, print1)
fn()
fn()
fn()
const doSth = (t, cb) => {return () => {if (--t === 0) {cb()}}
}
const print1 = (cb) => {console.log('第一次打印')// 打印出這句話后執行cbcb()
}
const print2 = (cb) => {console.log('第二次打印')cb()
}
const fn = doSth(3, print1.bind(null, print2))
fn()
fn()
fn()

13、401:沒有提供認證信息。請求的時候沒有帶上 Token 等

  1. 預編譯、作用域、閉包
  2. 內容字數位置,寬度高度不定,只展示2行,多余內容…
  3. 中斷ajax請求(超時、手動中斷)后端響應超時:吉行無憂
  4. 事件代理的使用場景
  5. vue核心功能

微信網頁版:Http 請求報文頭部信息,其中 Connection: keep-alive 意味著這次請求結束后不會關閉 TCP 連接

待續…

es6程序設計
websocket
面試題
vue3.0+ts
響應式布局
vue3.0星座項目
使用開發者工具

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

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

相關文章

JS的自定義事件(觀察者模式)

1      var Event {2 on: function (eventName, callback) {3 console.log("eventName:"eventName)4 if (!this.handles) {5 Object.defineProperty(this, "handles", {6 …

glog日志庫使用筆記

日志能方便地診斷程序原因、統計程序運行數據&#xff0c;是大型軟件系統必不可少的組件之一。glog 是google的開源日志系統&#xff0c;相比較log4系列的日志系統&#xff0c;它更加輕巧靈活。 在Github上下載glog&#xff0c;解壓后用CMake生成VS2017工程&#xff08;默認生成…

javascript --- 異步工作流的動態排隊技術

很多情況下,使用async.series和async.paralle存在一個明顯的問題,即: 1.其任務隊列是靜態的,在其調用前,一定要明確任務隊列的數量,一旦明確了任務隊列的數量,就不能改變. 2.倘如要同時并發讀取上千個文件,使用async.paralle明顯不可能(各線程搶資源,根本不夠用),使用async.ser…

java中的內部類總結

內部類不是很好理解&#xff0c;但說白了其實也就是一個類中還包含著另外一個類 如同一個人是由大腦、肢體、器官等身體結果組成&#xff0c;而內部類相當于其中的某個器官之一&#xff0c;例如心臟&#xff1a;它也有自己的屬性和行為&#xff08;血液、跳動&#xff09; 顯然…

elementPlus關閉彈窗,頁面原先滾動條消失

一開始以為是彈窗內容超過一屏引起&#xff0c;改為一屏內也不能解決。 打開控制臺&#xff0c;發現彈窗后自動給body標簽加上了類el-popup-parent–hidden&#xff0c;關閉后也沒去除&#xff0c;因此手動刪除該類。 document.getElementsByTagName(body)[0].className ;

在Windows下如何創建虛擬環境(默認情況下)

很多小伙伴平時在使用Python的時候&#xff0c;有的項目需要使用Python2來進行開發&#xff0c;有的項目則是需要Python3來進行開發。當不清楚怎么分開環境的時候&#xff0c;此時兩個環境開始打架&#xff0c;彼此傻傻分不清楚。虛擬環境作為隔離的利器應運而生&#xff0c;其…

javascript --- 隱藏內部實現(最小暴露原則)

看下面的一個例子: function doSomething(a) {b a doSomethingElse( a * 2 );console.log( b * 3 ); }function doSomethingElse(a) {return a - 1; }var b;doSomething( 2 ) ; // 15上述代碼中的doSomethingElse實際上應該是doSomething的"私有"部分,根據最小暴露…

selenium python 入門-元素定位

環境搭建 安裝教程 http://www.testclass.net/selenium_python/install-selenium/ chrome瀏覽器 還需要下載chrome driver 把下載的chromedriver .exe放到chrome安裝目錄下的Application目錄下和 python所在的安裝目錄下&#xff0c;比如我的目錄是C:\Program Files (x86)\Goog…

ES5程序設計轉ES6 筆記

課程鏈接 1. 立即執行函數 特點&#xff1a;執行結束&#xff0c;立即銷毀&#xff1b;獨立作用域執行符號&#xff08;&#xff09;只能跟在表達式后面&#xff0c;不能放在函數聲明后分號可以寫在前面/后面document為傳入實參&#xff0c;doc為形參 ;(function(doc){...co…

DPDK helloworld 源碼閱讀

在 DPDK Programmers Guides 中的 EAL 一篇中有一個圖可以很清晰地看到一個DPDK的應用程序的大致執行思路&#xff1a; 初始化檢查CPU支持、微架構配置等完成后&#xff0c;執行main()函數。 第一步是 rte_eal_init()&#xff0c;核心初始化和啟動。其中線程使用的是pthread庫&…

javascript --- 作用域和閉包

執行環境: // 定義了變量或函數有權訪問的其他數據,決定了它們各自的行為 // 每個執行環境都有一個變量對象與之對應,執行環境中所定義的所有變量和函數都保存在變量對象中 // 某個執行環境中的所有代碼執行完畢后,該執行環境被銷毀,保存在其中的所有變量和函數定義也隨之銷毀…

異步下載圓形進度條顯示進度

圓形進度條參考鏈接即可&#xff1a;使用css3實現圓形進度條 需求點擊下載后遮罩層顯示下載進度&#xff1a; 1.圓形進度條參考以上鏈接&#xff0c;有點小瑕疵&#xff0c;可更改定位距離實現重合。 2.遮罩層&#xff1a; .lbOverlay{display: none;position: fixed;left: 0;…

javascript基本功

隱式類型轉換 var a {_default: 0,toString: function () {return a._default} } if (a 1 && a 2 && a 3) {console.log(解) } 訪問一個變量的時候進行攔截 var _default 0 Object.defineProperty(window, a, {get() {return _default} }) if (a 1 &am…

深信服筆試,抓兔子

*問題描述&#xff1a;抓兔子n個排成一排的洞&#xff0c;編號為1到n&#xff0c;兔子每天晚上會跳到相鄰的一個洞里&#xff0c;小q每天只能白天檢查其中的一個洞&#xff0c;小q會告訴你每天檢查的洞&#xff0c;分析是否一定能抓到兔子示例&#xff1a;3個洞&#xff0c;第一…

es6 --- 模塊

function foo(){var something cool;var another [1, 2, 3];function doSomething() {console.log( something );}function doAnother() {console.log( another.join( " ! " ) );} } // 是一個不明顯的閉包,doSomething()和doAnother()保持了foo的內部作用域接下來…

Java之遞歸遍歷目錄,修改指定文件的指定內容

EditProperties.java 1 package PropertiesOperation.Edit;2 3 import java.io.File;4 5 /**6 * 替換指定Porpoerties文件中的指定內容7 * 三個參數&#xff1a;8 * filePath&#xff1a;存放properties文件的目錄9 * srcStr&#xff1a;需要替換的字符串 10 * desStr&…

學習日志---7

1.復習Linux hadoop hdfs MapReduce基礎知識 1&#xff0c;列舉linux常用命令 shutdown now reboot mkdir mkdir -p touch filename rm -r filename rm -rf filename vi filename i--->可編輯狀態 esc --> : --->wq 保存退出 q! wq! cat grep find ifconfig ping user…

javascript --- 屬性描述符

從ES5開始,所有的屬性都具備了屬性描述符 var myObject {a: 2 };Object.getOwnPropertyDescriptor(myObject, "a"); //{ // value:2, // writable: true, // 可寫 // enumerable: true, // 可枚舉 // configurble: true // 可配置 //}定義屬性…

看了嗎網址鏈接

sklearn實戰-乳腺癌細胞數據挖掘&#xff08;博主親自錄制視頻&#xff09; https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare # -*- coding: utf-8 -*- ""&qu…

JMeter 性能測試進階實戰

課程簡介 本課程制作的主要目的是為了讓大家快速上手 JMeter&#xff0c;期間穿插了大量主流項目中用到的技術&#xff0c;以及結合當今主流微服務技術提供了測試 Dubbo 接口、Java 工程技術具體實施方案&#xff0c;注重實踐、注意引導測試思維、拒絕枯燥的知識點羅列、善于用…