當前位置:首頁 » 網頁前端 » 前端工程師js面試題
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

前端工程師js面試題

發布時間: 2022-12-17 21:20:54

❶ Web前端崗位面試題有哪些

前端面試題匯總,多餘的就不說先做會這些東西吧

HTML

Doctype作用?嚴格模式與混雜模式如何區分?它們有何意義?

HTML5 為什麼只需要寫 <!DOCTYPE HTML>?
行內元素有哪些?塊級元素有哪些? 空(void)元素有那些?
頁面導入樣式時,使用link和@import有什麼區別?
介紹一下你對瀏覽器內核的理解?
常見的瀏覽器內核有哪些?
html5有哪些新特性、移除了那些元素?如何處理HTML5新標簽的瀏覽器兼容問題?如何區分 HTML 和 HTML5?
簡述一下你對HTML語義化的理解?
HTML5的離線儲存怎麼使用,工作原理能不能解釋一下?
瀏覽器是怎麼對HTML5的離線儲存資源進行管理和載入的呢?
請描述一下 cookies,sessionStorage 和 localStorage 的區別?
iframe有那些缺點?
Label的作用是什麼?是怎麼用的?(加 for 或 包裹)
HTML5的form如何關閉自動完成功能?
如何實現瀏覽器內多個標簽頁之間的通信? (阿里)
webSocket如何兼容低瀏覽器?(阿里)
頁面可見性(Page Visibility)API 可以有哪些用途?
如何在頁面上實現一個圓形的可點擊區域?
實現不使用 border 畫出1px高的線,在不同瀏覽器的Quirksmode和CSSCompat模式下都能保持同一效果。
網頁驗證碼是幹嘛的,是為了解決什麼安全問題?
tite與h1的區別、b與strong的區別、i與em的區別?

css

介紹一下標準的CSS的盒子模型?與低版本IE的盒子模型有什麼不同的?
CSS選擇符有哪些?哪些屬性可以繼承?
CSS優先順序演算法如何計算?
CSS3新增偽類有那些?
如何居中div?如何居中一個浮動元素?如何讓絕對定位的div居中?
display有哪些值?說明他們的作用。
position的值relative和absolute定位原點是?
CSS3有哪些新特性?
請解釋一下CSS3的Flexbox(彈性盒布局模型),以及適用場景?
用純CSS創建一個三角形的原理是什麼?
一個滿屏 品 字布局 如何設計?
常見兼容性問題?
li與li之間有看不見的空白間隔是什麼原因引起的?有什麼解決辦法?
經常遇到的瀏覽器的兼容性有哪些?原因,解決方法是什麼,常用hack的技巧 ?
為什麼要初始化CSS樣式。
absolute的containing block計算方式跟正常流有什麼不同?
CSS里的visibility屬性有個collapse屬性值是幹嘛用的?在不同瀏覽器下以後什麼區別?
position跟display、margin collapse、overflow、float這些特性相互疊加後會怎麼樣?
對BFC規范(塊級格式化上下文:block formatting context)的理解?
CSS權重優先順序是如何計算的?
請解釋一下為什麼會出現浮動和什麼時候需要清除浮動?清除浮動的方式
移動端的布局用過媒體查詢嗎?
使用 CSS 預處理器嗎?喜歡那個?
CSS優化、提高性能的方法有哪些?
瀏覽器是怎樣解析CSS選擇器的?
在網頁中的應該使用奇數還是偶數的字體?為什麼呢?
margin和padding分別適合什麼場景使用?
抽離樣式模塊怎麼寫,說出思路,有無實踐經驗?[阿里航旅的面試題]
元素豎向的百分比設定是相對於容器的高度嗎?
全屏滾動的原理是什麼?用到了CSS的那些屬性?
什麼是響應式設計?響應式設計的基本原理是什麼?如何兼容低版本的IE?
視差滾動效果,如何給每頁做不同的動畫?(回到頂部,向下滑動要再次出現,和只出現一次分別怎麼做?)
::before 和 :after中雙冒號和單冒號 有什麼區別?解釋一下這2個偽元素的作用。
如何修改chrome記住密碼後自動填充表單的黃色背景 ?
你對line-height是如何理解的?
設置元素浮動後,該元素的display值是多少?(自動變成display:block)
怎麼讓Chrome支持小於12px 的文字?
讓頁面里的字體變清晰,變細用CSS怎麼做?(-webkit-font-smoothing: antialiased;)
font-style屬性可以讓它賦值為「oblique」 oblique是什麼意思?
position:fixed;在android下無效怎麼處理?
如果需要手動寫動畫,你認為最小時間間隔是多久,為什麼?(阿里)
display:inline-block 什麼時候會顯示間隙?(攜程)
overflow: scroll時不能平滑滾動的問題怎麼處理?
有一個高度自適應的div,裡面有兩個div,一個高度100px,希望另一個填滿剩下的高度。
png、jpg、gif 這些圖片格式解釋一下,分別什麼時候用。有沒有了解過webp?
什麼是Cookie 隔離?(或者說:請求資源的時候不要讓它帶cookie怎麼做)
style標簽寫在body後與body前有什麼區別?

JavaScript

介紹JavaScript的基本數據類型。
說說寫JavaScript的基本規范?
JavaScript原型,原型鏈 ? 有什麼特點?
JavaScript有幾種類型的值?(堆:原始數據類型和 棧:引用數據類型),你能畫一下他們的內存圖嗎?
Javascript如何實現繼承?
Javascript創建對象的幾種方式?
Javascript作用鏈域?
談談This對象的理解。
eval是做什麼的?
什麼是window對象? 什麼是document對象?
null,undefined的區別?
寫一個通用的事件偵聽器函數(機試題)。
[「1」, 「2」, 「3」].map(parseInt) 答案是多少?
關於事件,IE與火狐的事件機制有什麼區別? 如何阻止冒泡?
什麼是閉包(closure),為什麼要用它?
javascript 代碼中的」use strict」;是什麼意思 ? 使用它區別是什麼?
如何判斷一個對象是否屬於某個類?
new操作符具體幹了什麼呢?
用原生JavaScript的實現過什麼功能嗎?
Javascript中,有一個函數,執行時對象查找時,永遠不會去查找原型,這個函數是?
對JSON的了解?
[].forEach.call($$("*"),function(a){ a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16) }) 能解釋一下這段代碼的意思嗎?
js延遲載入的方式有哪些?
Ajax 是什麼? 如何創建一個Ajax?
同步和非同步的區別?
如何解決跨域問題?
頁面編碼和被請求的資源編碼如果不一致如何處理?
模塊化開發怎麼做?
AMD(Moles/Asynchronous-Definition)、CMD(Common Mole Definition)規范區別?
requireJS的核心原理是什麼?(如何動態載入的?如何避免多次載入的?如何 緩存的?)
讓你自己設計實現一個requireJS,你會怎麼做?
談一談你對ECMAScript6的了解?
ECMAScript6 怎麼寫class么,為什麼會出現class這種東西?
非同步載入的方式有哪些?
documen.write和 innerHTML的區別?
DOM操作——怎樣添加、移除、移動、復制、創建和查找節點?
.call() 和 .apply() 的含義和區別?
數組和對象有哪些原生方法,列舉一下?
JS 怎麼實現一個類。怎麼實例化這個類
JavaScript中的作用域與變數聲明提升?
如何編寫高性能的Javascript?
那些操作會造成內存泄漏?
JQuery的源碼看過嗎?能不能簡單概況一下它的實現原理?
jQuery.fn的init方法返回的this指的是什麼對象?為什麼要返回this?
jquery中如何將數組轉化為json字元串,然後再轉化回來?
jQuery 的屬性拷貝(extend)的實現原理是什麼,如何實現深拷貝?
jquery.extend 與 jquery.fn.extend的區別?
jQuery 的隊列是如何實現的?隊列可以用在哪些地方?
談一下Jquery中的bind(),live(),delegate(),on()的區別?
JQuery一個對象可以同時綁定多個事件,這是如何實現的?
是否知道自定義事件。jQuery里的fire函數是什麼意思,什麼時候用?
jQuery 是通過哪個方法和 Sizzle 選擇器結合的?(jQuery.fn.find()進入Sizzle)
針對 jQuery性能的優化方法?
Jquery與jQuery UI有啥區別?
JQuery的源碼看過嗎?能不能簡單說一下它的實現原理?
jquery 中如何將數組轉化為json字元串,然後再轉化回來?
jQuery和Zepto的區別?各自的使用場景?
針對 jQuery 的優化方法?
Zepto的點透問題如何解決?
jQueryUI如何自定義組件?
需求:實現一個頁面操作不會整頁刷新的網站,並且能在瀏覽器前進、後退時正確響應。給出你的技術實現方案?
如何判斷當前腳本運行在瀏覽器還是node環境中?(阿里)
移動端最小觸控區域是多大?
jQuery 的 slideUp動畫 ,如果目標元素是被外部事件驅動, 當滑鼠快速地連續觸發外部元素事件, 動畫會滯後的反復執行,該如何處理呢?
把 Script 標簽 放在頁面的最底部的body封閉之前 和封閉之後有什麼區別?瀏覽器會如何解析它們?
移動端的點擊事件的有延遲,時間是多久,為什麼會有? 怎麼解決這個延時?(click 有 300ms 延遲,為了實現safari的雙擊事件的設計,瀏覽器要知道你是不是要雙擊操作。)
知道各種JS框架(Angular, Backbone, Ember, React, Meteor, Knockout…)么? 能講出他們各自的優點和缺點么?
Underscore 對哪些 JS 原生對象進行了擴展以及提供了哪些好用的函數方法?
解釋JavaScript中的作用域與變數聲明提升?
那些操作會造成內存泄漏?
JQuery一個對象可以同時綁定多個事件,這是如何實現的?
Node.js的適用場景?
(如果會用node)知道route, middleware, cluster, nodemon, pm2, server-side rendering么?
解釋一下 Backbone 的 MVC 實現方式?
什麼是「前端路由」?什麼時候適合使用「前端路由」? 「前端路由」有哪些優點和缺點?
知道什麼是webkit么? 知道怎麼用瀏覽器的各種工具來調試和debug代碼么?
如何測試前端代碼么? 知道BDD, TDD, Unit Test么? 知道怎麼測試你的前端工程么(mocha, sinon, jasmin, qUnit..)?
前端templating(Mustache, underscore, handlebars)是幹嘛的, 怎麼用?
簡述一下 Handlebars 的基本用法?
簡述一下 Handlerbars 的對模板的基本處理流程, 如何編譯的?如何緩存的?
用js實現千位分隔符?(來源:前端農民工,提示:正則+replace)
檢測瀏覽器版本版本有哪些方式?
我們給一個dom同時綁定兩個點擊事件,一個用捕獲,一個用冒泡,你來說下會執行幾次事件,然後會先執行冒泡還是捕獲

其他問題

原來公司工作流程是怎麼樣的,如何與其他人協作的?如何誇部門合作的?
你遇到過比較難的技術問題是?你是如何解決的?
設計模式 知道什麼是singleton, factory, strategy, decrator么?
常使用的庫有哪些?常用的前端開發工具?開發過什麼應用或組件?
頁面重構怎麼操作?
列舉IE與其他瀏覽器不一樣的特性?
99%的網站都需要被重構是那本書上寫的?
什麼叫優雅降級和漸進增強?
是否了解公鑰加密和私鑰加密。
WEB應用從伺服器主動推送Data到客戶端有那些方式?
對Node的優點和缺點提出了自己的看法?
你有用過哪些前端性能優化的方法?
http狀態碼有那些?分別代表是什麼意思?
一個頁面從輸入 URL 到頁面載入顯示完成,這個過程中都發生了什麼?(流程說的越詳細越好)
部分地區用戶反應網站很卡,請問有哪些可能性的原因,以及解決方法?
從打開app到刷新出內容,整個過程中都發生了什麼,如果感覺慢,怎麼定位問題,怎麼解決?
除了前端以外還了解什麼其它技術么?你最最厲害的技能是什麼?
你用的得心應手用的熟練地編輯器&開發環境是什麼樣子?
對前端界面工程師這個職位是怎麼樣理解的?它的前景會怎麼樣?
你怎麼看待Web App 、hybrid App、Native App?
你移動端前端開發的理解?(和 Web 前端開發的主要區別是什麼?)
你對加班的看法?
平時如何管理你的項目?
說說最近最流行的一些東西吧?常去哪些網站?
如何設計突發大規模並發架構?
說說最近最流行的一些東西吧?常去哪些網站?
是否了解開源的工具 bower、npm、yeoman、grunt、gulp,一個 npm 的包里的 package.json 具備的必要的欄位都有哪些?(名稱、版本號,依賴)
每個模塊的代碼結構都應該比較簡單,且每個模塊之間的關系也應該非常清晰,隨著功能和迭代次數越來越多,你會如何去保持這個狀態的?
Git知道branch, diff, merge么?
如何設計突發大規模並發架構?
當團隊人手不足,把功能代碼寫完已經需要加班的情況下,你會做前端代碼的測試嗎?
說說最近最流行的一些東西吧?平時常去哪些網站?
知道什麼是SEO並且怎麼優化么? 知道各種meta data的含義么?
移動端(Android IOS)怎麼做好用戶體驗?
簡單描述一下你做過的移動APP項目研發流程?
你在現在的團隊處於什麼樣的角色,起到了什麼明顯的作用?
你認為怎樣才是全端工程師(Full Stack developer)?
介紹一個你最得意的作品吧?
你有自己的技術博客嗎,用了哪些技術?
對前端安全有什麼看法?
是否了解Web注入攻擊,說下原理,最常見的兩種攻擊(XSS 和 CSRF)了解到什麼程度?
項目中遇到國哪些印象深刻的技術難題,具體是什麼問題,怎麼解決?。
最近在學什麼東西?
你的優點是什麼?缺點是什麼?
如何管理前端團隊?
最近在學什麼?能談談你未來3,5年給自己的規劃嗎?

❷ 面試Web前端需要注意什麼會面試哪些問題

作為一名HTML5前端工程師,為了工作,為了就業我們免不了要參加各種各樣的面試。為此總結了面試前的注意事項:

第一:注意自己的儀容儀表

面試之前,一定要再次從頭到腳地將自己的儀容儀表檢查一遍。檢查時主要包括,自己的牙縫是不是還有食物殘渣,所以你需要就近找一個衛生間,如果沒有衛生間就近找一個角落也是可以的,但是切記一定不要在大庭廣眾之下。因此,為了給自己整理出著裝的時間請在約定時間前20分鍾到達。

第二:再次檢查面試時所需的資料是否都已帶全

這些資料主要包括:身份證明、學歷文憑證明、個人簡歷、以往作品等等,如果這些東西齊全之後,需要對這些資料做一個整理與排序。因為沒有哪個面試官希望看到面試者拿出一堆「莫名其妙」的東西塞給他,讓他自己再一頁一頁的翻找自己需要的內容,如果說這些資料在面試官手中不小心散落一地,結果可想而知。這樣的求職者在面試官眼中也一定不是一個讓人放心、有條不紊的員工。當然如果檢查時發現資料沒有帶全,也不要緊張。反而你要慶倖幸虧及時檢查,也有足夠的時間組織語言去向面試官解釋。

第三:面試之前將通信工具調成振動或關閉狀態

雖然說面試者與面試官之間是一個平等的關系,但畢竟你是去人家公司求職的,始終處於一個被動的狀態,所以最起碼的尊重還是要做到的。曾經有調查顯示,對於面試過程中接電話或是被電話打斷的求職者,會被HR減分。

第四:等候面試官時,仔細觀察多了解面試公司

在等候面試官時,可以暗自觀察一下公司的大體情況比如員工的著裝風格、公司的LOGO或是貼在牆上的企業文化、公司的環境等等,一來可以在接下來的面試過程中表現出自己對公司的認同感,二來也可以讓自己對求職公司多些了解,以確定是否要接受這里的工作。如果你身邊有公司的資料宣傳架,不妨取一本翻看一下,也會增加HR對你的好感。

第五:放鬆心情,保持自信

面試時一定要保持一定的自信,這樣也會給面試官留下很好的印象。面試只是你步入工作的第一步,即便是失敗了那也是人生重要的經歷。失敗是為了更好的迎接下一個挑戰。

作為一名web前端工程師千萬不要覺得懂技術面試就能萬事大吉了,像以上五點細節性的東西也是一定要掌握的。

面試題系列:

網頁鏈接

❸ 前端工程師面試題vue2知識整理

⾸先呢,所謂的插槽就是⼀個佔位符,將⾃定義組件的內容展示出來.我們知道⾃定義的組件⾥⾯如果寫內容的話,⻚⾯是不會顯
示出來的,如果我們想讓⾃定義組件⾥⾯的內容顯示出來,我們就需要使⽤ slot 的插槽.
⽽插槽分別具名插槽和匿名插槽、以及作⽤域插槽. 我們⽤的⽐較多的具名插槽和匿名插槽,具名插槽需要所有 slot 標簽上指定
name 屬性,⽽在對應標簽上添加# 屬性指定名字.
在項⽬中我們⼀般在進⾏組件封裝的時候會使⽤插槽,以上就是我對插槽的理解.

作用域插槽
是把子組件里的數據傳到父組件的插槽里使用

什麼是跨域
跨域是瀏覽器的跨域 不符合 域名 協議 埠號一樣(同源策略) 的請求都會出現跨域的問題
跨域的解決方法
最多的情況是後端處理跨域
前端的跨域
伺服器代理
jsonp
vue 中是 proxy 代理實現跨域

vue 的跨域
用 proxy 實現

攔截器有兩種 一個是請求攔截一個是響應攔截
攔截器不需要手動調用而是每次發送 http 請求的時候都會自動觸發
我們一般在請求攔截中 放全局的 loading 和 token
在響應攔截中關閉全局的 loading 和對 token 進行過期處理 還可以處理錯誤編碼字典

⾸先呢 jquery 他是⽤ js 封裝的⼀個類庫,主要是為了⽅便操作 dom 元素,⽽ vue 他是⼀個框架,並且呢,他會從真實 dom 構建出⼀個
虛擬的 dom 樹,通過 di!演算法渲染只發⽣改變的 dom 元素,其他的相同的 dom 元素不⽤在重新渲染. ⽽使⽤ jquery 去改變 dom 元素
的時候,即使有相同的 dom 元素也會重新渲染, jq 重點操作 dom,而 vue 重點操作數據。以上就是我對 vue 和 jquery 區別的理解.

在 vue2 中 vue 實例的 data 數據是響應式 的 就是數據變了 視圖也會跟著變,如果給某一個 data 新添加了一個欄位 這個新添加的欄位因為 js 的限制不響應,需要使用 this.$set 方法代替原本的普通添加方法 就能實現響應,這個方法的三個參數 是給誰添加 添加的欄位 初始值 如果不是在組件中 用這個方法 那麼就用 Vue.set

根實例對象data可以是對象也可以是函數(根實例是單例),不會產生數據污染情況
如果不是一個函數,每個組件實例的data都是同一個引用數據,當該組件作為公共組件共享使用,一個地方的data更改,所有的data一起改變,如果data是一個函數,每個實例的data都在閉包中,就不會各自影響了。

query可以使用name和path而params只能使用name
使用params傳參刷新後不會保存,而query傳參刷新後可以保存
Params在地址欄中不會顯示,query會顯示
Params可以和動態路由一起使用,query不可以

同步更改mutations
異部更改action,action中通過commit觸發mutations進行state數據更改
頁面中觸發action中函數

❹ 前端面試題2021(JS篇(上))

(水仙花數也被稱為超完全數字不變數、自戀數、自冪數、阿姆斯特朗數。水仙花數是指一個3位數,它的每個位上的數字的3次冪之和等於它本身 例如: 1~3 + 5~3 + 3~3 =153)

(質數就是在大於1的自然數中,除了1和它本身以外不在有其他因數的自然數)

a:11,b:10

A [] B [""] C [undefined] D [null]

A ['false'] B [false] C[0] D[]

A null B undefined C 「hello」 D「world」

A "llowo" B "llow" C "llo" D null

A "llowo" B "llow" C "llo" D null

A getYear()
B getMonth()
C getDay()
DgetDate()

A 基於對象
B 移動端優先
C 事件驅動
D 跨平台

A String
B Float
C Number
D Null

A 任意單個字元
B 任意單個字母
C 任意單個字母、數字、下劃線
D 任意單個字母、數學、下劃線、$符號

A <javascript>
B <script>
C <scripting>
D <js>

A var s = 'heloe'
B var n = 20
C var x = document.getElementsByTagName('box')
D var y = document.querySelectorAll('ul li')

A document.createElement
B document.createTextNode
C document.getElementById
B document.querySelector

A ele.innerText
B ele.innerHTML
C ele.textContent
D ele.htmlContent

插入排序的演算法描述的是一種簡單直觀的排序演算法,它的工作原理是通過構建有序序列,對於未排序的數據,在已排序序列中從後向前掃描,找到對應位置並插入

A.對數組里數據的排序可以用sort函數,如果排序效果非預期,可以給sort函數加一個排序的參數
B.reverse用於對數組數據的倒序排列
C.向數組的最後位置加一個新元素,可以用pop方法
D.unshift方法用於向數組刪除第一個元素

A.window.status = "已經選中該文本框"
B.document.status = '已經選中該文本框'
C.window.screen = '已經選中該文本框'
D.document.screen = '已經選中該文本框'

A <input type="button" value="new" onclick="open('new.html','_blank')" />
B. <input type="button" value="new" onclick="window.location = 'new.html'" />
C.<input type="button" value="new " onclick = "location.assign('new.html)">
D. <form target = "_blank" action="new.html">
<input type="submit" value="new" />
</form>

A.<script type="text/javascript">document.write(<h1>hello</h1>)</script>
B.<script type="text/javascript">document.write("<h1>hello</h1>")</script>
C.<script type="text/javascript"><h1>hello</h1></script>
D.<h1><script type="text/javascript">document.write("hello")</script></h1>

以下說法中正確的是(AD)
A.在頁面的第二個文本框中輸入內容後,當目標離開第二個文本框時,第一個文本框的內容不變
B.在頁面的第一個文本框中輸入內容後,當滑鼠離開第一個文本框時,將在第二個文本框中復制第一個文本框的內容
C.在頁面的第二個文本框中輸入內容後,當滑鼠離開第二個文本框時候,將在第一個文本框中復制第二個文本框的內容
D.在頁面的第一個文本框中輸入內容後,當滑鼠離開第一個文本框時,第二個文本框的內容不變

❺ 如何面試前端工程師

隨著時代的發展,很多新興的就業職位隨之產生。前端工程師將就是隨著互聯網的快速發展而產生的。其實在很多人的觀念里,前端工程師也就是一個切頁面的而已,他們也就是會html、css、javascript這些沒有任何技術含量的網頁製作而已。然而隨著技術飛速發展,人們對這些技術的要求也是越來越高,如果只憑著一個人來把所有的事情都解決是很困難的,所以這個時候前端工程師就開始發揮著他們很大的作用了。

那我們應該如何來面試前端工程師呢?

  • 談吐要大方得體

在我們在面對面試官時我們千萬不要緊張。在進行自我介紹時我們要努力做到自信大方、吐字清晰。我們在自我介紹時要用簡明扼要的話語來介紹自己,突出自己的優點表明自己的求職意向。你要通過寥寥數語把自己的優勢都向面試官介紹清楚。記住不必要的話語要少說。

好了關於如何面試前端工程師這個話題我就聊到這了。希望我的回答能對你有所幫助。

❻ 前端經典面試題(包含JS、CSS、React、瀏覽器等)

防抖

節流

誤區:我們經常說get請求參數的大小存在限制,而post請求的參數大小是無限制的。

實際上HTTP 協議從未規定 GET/POST 的請求長度限制是多少。對get請求參數的限制是來源與瀏覽器或web伺服器,瀏覽器或web伺服器限制了url的長度。為了明確這個概念,我們必須再次強調下面幾點:

補充補充一個get和post在緩存方面的區別:

可從IIFE、AMD、CMD、CommonJS、UMD、webpack(require.ensure)、ES Mole、

vue和react都是採用diff演算法來對比新舊虛擬節點,從而更新節點。在vue的diff函數中(建議先了解一下diff演算法過程)。在交叉對比中,當新節點跟舊節點 頭尾交叉對比 沒有結果時,會根據新節點的key去對比舊節點數組中的key,從而找到相應舊節點(這里對應的是一個key => index 的map映射)。如果沒找到就認為是一個新增節點。而如果沒有key,那麼就會採用遍歷查找的方式去找到對應的舊節點。一種一個map映射,另一種是遍歷查找。相比而言。map映射的速度更快。vue部分源碼如下:

創建map函數

遍歷尋找

在React中, 如果是由React引發的事件處理(比如通過onClick引發的事件處理),調用setState不會同步更新this.state,除此之外的setState調用會同步執行this.state 。所謂「除此之外」,指的是繞過React通過addEventListener直接添加的事件處理函數,還有通過setTimeout/setInterval產生的非同步調用。

**原因:**在React的setState函數實現中,會根據一個變數isBatchingUpdates判斷是直接更新this.state還是放到隊列中回頭再說,而isBatchingUpdates默認是false,也就表示setState會同步更新this.state,但是, 有一個函數batchedUpdates,這個函數會把isBatchingUpdates修改為true,而當React在調用事件處理函數之前就會調用這個batchedUpdates,造成的後果,就是由React控制的事件處理過程setState不會同步更新this.state

虛擬dom相當於在js和真實dom中間加了一個緩存,利用dom diff演算法避免了沒有必要的dom操作,從而提高性能。

具體實現步驟如下:

用 JavaScript 對象結構表示 DOM 樹的結構;然後用這個樹構建一個真正的 DOM 樹,插到文檔當中

當狀態變更的時候,重新構造一棵新的對象樹。然後用新的樹和舊的樹進行比較,記錄兩棵樹差異

把2所記錄的差異應用到步驟1所構建的真正的DOM樹上,視圖就更新了。

結構:display:none: 會讓元素完全從渲染樹中消失,渲染的時候不佔據任何空間, 不能點擊, visibility: hidden:不會讓元素從渲染樹消失,渲染元素繼續占據空間,只是內容不可見,不能點擊 opacity: 0: 不會讓元素從渲染樹消失,渲染元素繼續占據空間,只是內容不可見,可以點擊

繼承:display: none:是非繼承屬性,子孫節點消失由於元素從渲染樹消失造成,通過修改子孫節點屬性無法顯示。visibility: hidden:是繼承屬性,子孫節點消失由於繼承了hidden,通過設置visibility: visible;可以讓子孫節點顯式。

性能:displaynone : 修改元素會造成文檔迴流,讀屏器不會讀取display: none元素內容,性能消耗較大 visibility:hidden: 修改元素只會造成本元素的重繪,性能消耗較少讀屏器讀取visibility: hidden元素內容 opacity: 0 :修改元素會造成重繪,性能消耗較少

聯系:它們都能讓元素不可見

常用的一般為三種 .clearfix , clear:both , overflow:hidden ;

比較好是 .clearfix ,偽元素萬金油版本,後兩者有局限性.

clear:both :若是用在同一個容器內相鄰元素上,那是賊好的,有時候在容器外就有些問題了, 比如相鄰容器的包裹層元素塌陷

overflow:hidden :這種若是用在同個容器內,可以形成 BFC 避免浮動造成的元素塌陷

概念:將多個小圖片拼接到一個圖片中。通過 background-position 和元素尺寸調節需要顯示的背景圖案。

優點:

缺點:

block 元素特點:

1.處於常規流中時,如果 width 沒有設置,會自動填充滿父容器 2.可以應用 margin/padding 3.在沒有設置高度的情況下會擴展高度以包含常規流中的子元素 4.處於常規流中時布局時在前後元素位置之間(獨佔一個水平空間) 5.忽略 vertical-align

inline 元素特點

1.水平方向上根據 direction 依次布局

2.不會在元素前後進行換行

3.受 white-space 控制

4. margin/padding 在豎直方向上無效,水平方向上有效

5. width/height 屬性對非替換行內元素無效,寬度由元素內容決定

6.非替換行內元素的行框高由 line-height 確定,替換行內元素的行框高由 height , margin , padding , border 決定 7.浮動或絕對定位時會轉換為 block 8. vertical-align 屬性生效

GIF :

JPEG

PNG

七種數據類型

(ES6之前)其中5種為基本類型: string , number , boolean , null , undefined ,

ES6出來的 Symbol 也是原始數據類型 ,表示獨一無二的值

Object 為引用類型(范圍挺大),也包括數組、函數,

輸出結果是:

工廠模式

簡單的工廠模式可以理解為解決多個相似的問題;

單例模式

只能被實例化(構造函數給實例添加屬性與方法)一次

沙箱模式

將一些函數放到自執行函數裡面,但要用閉包暴露介面,用變數接收暴露的介面,再調用裡面的值,否則無法使用裡面的值

發布者訂閱模式

就例如如我們關注了某一個公眾號,然後他對應的有新的消息就會給你推送,

代碼實現邏輯是用數組存貯訂閱者, 發布者回調函數裡面通知的方式是遍歷訂閱者數組,並將發布者內容傳入訂閱者數組

1.字面量

2.Object構造函數創建

3.使用工廠模式創建對象

4.使用構造函數創建對象

HTML中與javascript交互是通過事件驅動來實現的,例如滑鼠點擊事件onclick、頁面的滾動事件onscroll等等,可以向文檔或者文檔中的元素添加事件偵聽器來預訂事件。想要知道這些事件是在什麼時候進行調用的,就需要了解一下「事件流」的概念。

什麼是事件流:事件流描述的是從頁面中接收事件的順序,DOM2級事件流包括下面幾個階段。

addEventListener addEventListener 是DOM2 級事件新增的指定事件處理程序的操作,這個方法接收3個參數:要處理的事件名、作為事件處理程序的函數和一個布爾值。最後這個布爾值參數如果是true,表示在捕獲階段調用事件處理程序;如果是false,表示在冒泡階段調用事件處理程序。

IE只支持事件冒泡

獲取一個對象的原型,在chrome中可以通過__proto__的形式,或者在ES6中可以通過Object.getPrototypeOf的形式。

那麼Function.proto是什麼么?也就是說Function由什麼對象繼承而來,我們來做如下判別。

我們發現Function的原型也是Function。

我們用圖可以來明確這個關系:

這里來舉個栗子,以 Object 為例,我們常用的 Object 便是一個構造函數,因此我們可以通過它構建實例。

則此時, 實例為instance , 構造函數為Object ,我們知道,構造函數擁有一個 prototype 的屬性指向原型,因此原型為:

這里我們可以來看出三者的關系:

在 JS 中,繼承通常指的便是 原型鏈繼承 ,也就是通過指定原型,並可以通過原型鏈繼承原型上的屬性或者方法。

在函數式編程中,函數是一等公民。那麼函數柯里化是怎樣的呢?

函數柯里化指的是將能夠接收多個參數的函數轉化為接收單一參數的函數,並且返回接收餘下參數且返回結果的新函數的技術。

函數柯里化的主要作用和特點就是參數復用、提前返回和延遲執行。

在一個函數中,首先填充幾個參數,然後再返回一個新的函數的技術,稱為函數的柯里化。通常可用於在不侵入函數的前提下,為函數 預置通用參數 ,供多次重復調用。

call 和 apply 都是為了解決改變 this 的指向。作用都是相同的,只是傳參的方式不同。

除了第一個參數外, call 可以接收一個參數列表, apply 只接受一個參數數組。

bind 和其他兩個方法作用也是一致的,只是該方法會返回一個函數。並且我們可以通過 bind 實現柯里化。

如何實現一個 bind 函數

對於實現以下幾個函數,可以從幾個方面思考

如何實現一個call函數

如何實現一個apply函數

箭頭函數其實是沒有 this 的,這個函數中的 this 只取決於他外面的第一個不是箭頭函數的函數的 this 。在這個例子中,因為調用 a 符合前面代碼中的第一個情況,所以 this 是 window 。並且 this 一旦綁定了上下文,就不會被任何代碼改變。

在函數中,我們首先使用 var 關鍵字聲明了 name 變數。這意味著變數在創建階段會被提升( JavaScript 會在創建變數創建階段為其分配內存空間),默認值為 undefined ,直到我們實際執行到使用該變數的行。我們還沒有為 name 變數賦值,所以它仍然保持 undefined 的值。

使用 let 關鍵字(和 const )聲明的變數也會存在變數提升,但與 var 不同,初始化沒有被提升。在我們聲明(初始化)它們之前,它們是不可訪問的。這被稱為「暫時死區」。當我們在聲明變數之前嘗試訪問變數時, JavaScript 會拋出一個 ReferenceError 。

關於 let 的是否存在變數提升,我們何以用下面的例子來驗證:

let 變數如果不存在變數提升, console.log(name) 就會輸出 ConardLi ,結果卻拋出了 ReferenceError ,那麼這很好的說明了, let 也存在變數提升,但是它存在一個「暫時死區」,在變數未初始化或賦值前不允許訪問。

變數的賦值可以分為三個階段:

關於 let 、 var 和 function :

依次輸出:undefined -> 10 -> 20

答案: D

colorChange 方法是靜態的。靜態方法僅在創建它們的構造函數中存在,並且不能傳遞給任何子級。由於 freddie 是一個子級對象,函數不會傳遞,所以在 freddie 實例上不存在 freddie 方法:拋出 TypeError 。

1.使用第一次push,obj對象的push方法設置 obj[2]=1;obj.length+=1 2.使用第二次push,obj對象的push方法設置 obj[3]=2;obj.length+=1 3.使用console.log輸出的時候,因為obj具有 length 屬性和 splice 方法,故將其作為數組進行列印 4.列印時因為數組未設置下標為 0 1 處的值,故列印為empty,主動 obj[0] 獲取為 undefined

undefined {n:2}

首先,a和b同時引用了{n:2}對象,接著執行到a.x = a = {n:2}語句,盡管賦值是從右到左的沒錯,但是.的優先順序比=要高,所以這里首先執行a.x,相當於為a(或者b)所指向的{n:1}對象新增了一個屬性x,即此時對象將變為{n:1;x:undefined}。之後按正常情況,從右到左進行賦值,此時執行a ={n:2}的時候,a的引用改變,指向了新對象{n:2},而b依然指向的是舊對象。之後執行a.x = {n:2}的時候,並不會重新解析一遍a,而是沿用最初解析a.x時候的a,也即舊對象,故此時舊對象的x的值為{n:2},舊對象為 {n:1;x:{n:2}},它被b引用著。後面輸出a.x的時候,又要解析a了,此時的a是指向新對象的a,而這個新對象是沒有x屬性的,故訪問時輸出undefined;而訪問b.x的時候,將輸出舊對象的x的值,即{n:2}。

在比較相等性,原始類型通過它們的值進行比較,而對象通過它們的引用進行比較。 JavaScript 檢查對象是否具有對內存中相同位置的引用。

我們作為參數傳遞的對象和我們用於檢查相等性的對象在內存中位於不同位置,所以它們的引用是不同的。

這就是為什麼 { age: 18 } === { age: 18 } 和 { age: 18 } == { age: 18 } 返回 false 的原因。

所有對象鍵(不包括 Symbols )都會被存儲為字元串,即使你沒有給定字元串類型的鍵。這就是為什麼 obj.hasOwnProperty(Ƈ') 也返回 true 。

上面的說法不適用於 Set 。在我們的 Set 中沒有 「1」 : set.has(Ƈ') 返回 false 。它有數字類型 1 , set.has(1) 返回 true 。

這題考察的是對象的鍵名的轉換。

catch 塊接收參數 x 。當我們傳遞參數時,這與變數的 x 不同。這個變數 x 是屬於 catch 作用域的。

之後,我們將這個塊級作用域的變數設置為 1 ,並設置變數 y 的值。現在,我們列印塊級作用域的變數 x ,它等於 1 。

在 catch 塊之外, x 仍然是 undefined ,而 y 是 2 。當我們想在 catch 塊之外的 console.log(x) 時,它返回 undefined ,而 y 返回 2 。

❼ 各大公司前端面試都問些什麼

網路公司部分面試題
10 道 JS 題,10道 HTML/CSS題,可以選做,一個小時的時間。
具體題目內容和網上流傳的各種前端面試題都差不多,下面羅列幾個難題:
請簡述 JavaScript 事件模型(很重要,建議掌握,後續兩輪面試都問到了)
Ajax如何跨域,有幾種方法
用 js 和 jquery 創建一個 table
簡述css盒模型
寫一個左邊定寬,右邊自動擴展的網頁布局

❽ 前端工程師必問面試題vue路由模式路由守衛

vue的路由模式一共有兩種,分別是哈希和history,他們的區別是hash模式不會包含在http請求當中,並且hash不會重新載入頁面,而使用history模式的話,如果前端的url和後端發起請求的url不一致的話,會報404錯誤,所以history的原理是利用html5新增的兩個特性方法,分別是psuhState和replaceState來完成的,以上就是對vue路由的理解。

路由的導航守衛 又叫做路由的鉤子函數(生命周期函數)
就是在跳轉頁面的時候把路由欄下來,做一些操作在放行,vue一共提供了三種路由守衛。
第一種是全局守衛
beforeEach路由進入之前
afterEach路由進入之後

第二種 組件內守衛
beforeRouteEnter 路由進入之前
beforeRouteUpdate 路由更新之前
beforeRouteLeave 路由離開之前

第三種 路由獨享守衛
beforeEnter 路由進入之前

分別是 to from next
next 這個參數 在路由3.x版本的時候,是必須的
但是到了路由4.x版本的時候next參數變成可選的了
一般來說vue2搭配 3.x的路由
vue3搭配 4.x 的路由

比如說購物車頁面只有登陸的才能訪問,我們可以用組件級守衛購物車頁面,如果已經登陸存有token 的話,就繼續訪問這個頁面,如果沒有登陸的話就會跳轉到登陸頁面。

在項⽬中我們經常使⽤路由守衛實現⻚⾯的鑒權. ⽐如:當⽤戶登錄之後,我們會把後台返回的token以及⽤戶信息保存到vuex
和本地,當⻚⾯進⾏跳轉的時候,我們會在路由守衛⾥⾯獲取vuex⾥⾯的token,如果token存在的話,我們則使⽤next讓他進⼊要
跳轉的⻚⾯,如果token不存在的話我們使⽤next⽅法讓他回到登錄⻚
以上就是我對vue路由守衛的理解。

⾸先v-if和v-show都是控制元素的顯示與隱藏, 不過v-if控制元素的顯
示和隱藏的時候會刪除對⽤的dom元素,當每⼀個顯示的時候,都會重新創建dom和渲染. ⽽v-show則是通過css的display:none
和display:block來控制元素的顯示與隱藏. v-if⽐較耗費性能,所以我們涉及到頻繁的顯示隱藏操作我們建議使⽤v-show,如果不
是頻繁操作的話,我們可以v-if
在項⽬中我會經常使⽤v-if和v-show,⽐如我們在搜索功能的時候,他有⼀個歷史記錄,這個時候我們根據是否有搜索的結果來判
斷歷史記錄的顯示與隱藏,這塊我就可以使⽤v-if ,當然⽤v-show也可以. 以上就是我對v-if和v-show的理解。

v-for的優先順序⾼. 因為v-for的時候我們才開始渲染dom元素,這個v-if還⽆法進⾏判斷.
v-for和v-if不能同時使⽤,我們可以通過標簽,⽐如div或者template標簽來進⾏包裹,把v-if寫到包裹的標簽上⾯(寫到v-for外⾯)。

⾸先呢,methods是⽤來定義⽅法的區域,methods定義的⽅法需要調⽤才能觸發. 不具備緩存⾏
⽽computed是計算屬性,他依賴於屬性值的變化,當屬性發⽣改變的時候,計算屬性⾥⾯定義的⽅法就會觸發,computed具有緩
存性,依賴屬性值的變化⽽變化.
⽽watch主要是⽤於監聽,不具備被緩存性.依賴於數據變化⽽觸發.
在項⽬中,⽐如我們獲取state的狀態的時候我們會把它放到computed⾥⾯,或者在寫購物⻋數量計算的時候也會使⽤計算屬性.
⽽watch也在項⽬經常使⽤,⽐如我們封裝編輯 和 新增彈窗組件的時候會通過watch來進⾏id判斷我們要顯否要清空表單的數
據.
以上就是我對computed和watch的理解。