判斷 js 類型的方式1. typeof可以判斷出'string','number','boolean','undefined','symbol' 2. instanceof原理是 構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在對(duì)象的原型鏈中的任何位置 復(fù)制
3. Object.prototype.toString.call()常用于判斷瀏覽器內(nèi)置對(duì)象,對(duì)于所有基本的數(shù)據(jù)類型都能進(jìn)行判斷,即使是 null 和 undefined 4. Array.isArray()用于判斷是否為數(shù)組 ES5 和 ES6 分別幾種方式聲明變量ES5 有倆種: 注意: 閉包的概念?優(yōu)缺點(diǎn)?閉包的概念:閉包就是能讀取其他函數(shù)內(nèi)部變量的函數(shù)。 優(yōu)點(diǎn):
缺點(diǎn):
淺拷貝和深拷貝
復(fù)制
復(fù)制
遞歸函數(shù) 復(fù)制
如何實(shí)現(xiàn)一個(gè)深拷貝 數(shù)組去重的方法1.ES6 的 Set復(fù)制
2.reduce()let arr = [1,1,2,3,4,5,5,6]
3.filter()復(fù)制
DOM 事件有哪些階段?談?wù)剬?duì)事件代理的理解分為三大階段:捕獲階段--目標(biāo)階段--冒泡階段 事件代理簡單說就是:事件不直接綁定到某元素上,而是綁定到該元素的父元素上,進(jìn)行觸發(fā)事件操作時(shí)(例如'click'),再通過條件判斷,執(zhí)行事件觸發(fā)后的語句(例如'alert(e.target.innerHTML)') 好處:(1)使代碼更簡潔;(2)節(jié)省內(nèi)存開銷 js 執(zhí)行機(jī)制、事件循環(huán) JavaScript 語言的一大特點(diǎn)就是單線程,同一個(gè)時(shí)間只能做一件事。單線程就意味著,所有任務(wù)需要排隊(duì),前一個(gè)任務(wù)結(jié)束,才會(huì)執(zhí)行后一個(gè)任務(wù)。如果前一個(gè)任務(wù)耗時(shí)很長,后一個(gè)任務(wù)就不得不一直等著。JavaScript 語言的設(shè)計(jì)者意識(shí)到這個(gè)問題,將所有任務(wù)分成兩種,一種是同步任務(wù)(synchronous),另一種是異步任務(wù)(asynchronous),在所有同步任務(wù)執(zhí)行完之前,任何的異步任務(wù)是不會(huì)執(zhí)行的。 導(dǎo)圖要表達(dá)的內(nèi)容用文字來表述的話:
說完 JS 主線程的執(zhí)行機(jī)制,下面說說經(jīng)常被問到的 JS 異步中 宏任務(wù)(macrotasks)、微任務(wù)(microtasks)執(zhí)行順序。JS 異步有一個(gè)機(jī)制,就是遇到宏任務(wù),先執(zhí)行宏任務(wù),將宏任務(wù)放入 Event Queue,然后再執(zhí)行微任務(wù),將微任務(wù)放入 Event Queue,但是,這兩個(gè) Queue 不是一個(gè) Queue。當(dāng)你往外拿的時(shí)候先從微任務(wù)里拿這個(gè)回調(diào)函數(shù),然后再從宏任務(wù)的 Queue 拿宏任務(wù)的回調(diào)函數(shù)。如下圖: 宏任務(wù):整體代碼 script,setTimeout,setInterval 微任務(wù):Promise,process.nextTick 參考鏈接:這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 介紹下 promise.all Promise.all()方法將多個(gè)Promise實(shí)例包裝成一個(gè)Promise對(duì)象(p),接受一個(gè)數(shù)組(p1,p2,p3)作為參數(shù),數(shù)組中不一定需要都是Promise對(duì)象,但是一定具有Iterator接口,如果不是的話,就會(huì)調(diào)用Promise.resolve將其轉(zhuǎn)化為Promise對(duì)象之后再進(jìn)行處理。
async 和 await主要考察宏任務(wù)和微任務(wù),搭配promise,詢問一些輸出的順序 原理:async 和 await 用了同步的方式去做異步,async 定義的函數(shù)的返回值都是 promise,await 后面的函數(shù)會(huì)先執(zhí)行一遍,然后就會(huì)跳出整個(gè) async 函數(shù)來執(zhí)行后面js棧的代碼 ES6 的 class 和構(gòu)造函數(shù)的區(qū)別class 的寫法只是語法糖,和之前 prototype 差不多,但還是有細(xì)微差別的,下面看看: 1. 嚴(yán)格模式類和模塊的內(nèi)部,默認(rèn)就是嚴(yán)格模式,所以不需要使用 2. 不存在提升類不存在變量提升(hoist),這一點(diǎn)與 ES5 完全不同。 復(fù)制
3. 方法默認(rèn)是不可枚舉的ES6 中的 class,它的方法(包括靜態(tài)方法和實(shí)例方法)默認(rèn)是不可枚舉的,而構(gòu)造函數(shù)默認(rèn)是可枚舉的。細(xì)想一下,這其實(shí)是個(gè)優(yōu)化,讓你在遍歷時(shí)候,不需要再判斷 hasOwnProperty 了 4. class 的所有方法(包括靜態(tài)方法和實(shí)例方法)都沒有原型對(duì)象 prototype,所以也沒有[[construct]],不能使用 new 來調(diào)用。5. class 必須使用 new 調(diào)用,否則會(huì)報(bào)錯(cuò)。這是它跟普通構(gòu)造函數(shù)的一個(gè)主要區(qū)別,后者不用 new 也可以執(zhí)行。6. ES5 和 ES6 子類 this 生成順序不同ES5 的繼承先生成了子類實(shí)例,再調(diào)用父類的構(gòu)造函數(shù)修飾子類實(shí)例。ES6 的繼承先 生成父類實(shí)例,再調(diào)用子類的構(gòu)造函數(shù)修飾父類實(shí)例。這個(gè)差別使得 ES6 可以繼承內(nèi)置對(duì)象。 7. ES6可以繼承靜態(tài)方法,而構(gòu)造函數(shù)不能transform、translate、transition 分別是什么屬性?CSS 中常用的實(shí)現(xiàn)動(dòng)畫方式三者屬性說明 這里可以補(bǔ)充下 transition 和 animation 的比較,前者一般定義開始結(jié)束兩個(gè)狀態(tài),需要有觸發(fā)條件;而后者引入了關(guān)鍵幀、速度曲線、播放次數(shù)等概念,更符合動(dòng)畫的定義,且無需觸發(fā)條件 介紹一下rAF(requestAnimationFrame)專門用來做動(dòng)畫,不卡頓,用法和setTimeout一樣。對(duì) rAF 的闡述 MDN 資料 定時(shí)器一直是 js 動(dòng)畫的核心技術(shù),但它們不夠精準(zhǔn),因?yàn)槎〞r(shí)器時(shí)間參數(shù)是指將執(zhí)行代碼放入 UI 線程隊(duì)列中等待的時(shí)間,如果前面有其他任務(wù)隊(duì)列執(zhí)行時(shí)間過長,則會(huì)導(dǎo)致動(dòng)畫延遲,效果不精確等問題。 詳情:CSS3動(dòng)畫那么強(qiáng),requestAnimationFrame還有毛線用? javascript 的垃圾回收機(jī)制講一下定義:指一塊被分配的內(nèi)存既不能使用,又不能回收,直到瀏覽器進(jìn)程結(jié)束。 像 C 這樣的編程語言,具有低級(jí)內(nèi)存管理原語,如 malloc()和 free()。開發(fā)人員使用這些原語顯式地對(duì)操作系統(tǒng)的內(nèi)存進(jìn)行分配和釋放。 內(nèi)存生命周期中的每一個(gè)階段: 分配內(nèi)存 —? 內(nèi)存是由操作系統(tǒng)分配的,它允許您的程序使用它。在低級(jí)語言(例如 C 語言)中,這是一個(gè)開發(fā)人員需要自己處理的顯式執(zhí)行的操作。然而,在高級(jí)語言中,系統(tǒng)會(huì)自動(dòng)為你分配內(nèi)在。 四種常見的內(nèi)存泄漏:全局變量,未清除的定時(shí)器,閉包,以及 dom 的引用
對(duì)前端性能優(yōu)化有什么了解?一般都通過那幾個(gè)方面去優(yōu)化的?
前端安全也經(jīng)常被問到的,常見的有兩種——XSS、CSRF,詳見前端安全 2019前端面試系列——CSS面試題 |
|