前端面試題

前端面試問題

本套面試題由淺入深提問;
測試分支:externalChannels-frontEnd-test
測試文件:frontEndTest.html

底層原理

  • javascript數(shù)據(jù)類型有哪幾種?

null备绽、undefiend饭玲、number伊履、string、boolean艺骂、object五種類型;

  • 如何確定一個(gè)值到底是什么類型隆夯,例如使用instanceof運(yùn)算符钳恕;

1.三種方法確認(rèn)值是什么類型,typeof蹄衷、instanceof忧额、Object.prototype.toString
2.typeof運(yùn)算符可以返回一個(gè)值的數(shù)據(jù)類型(number、string愧口、boolean睦番、object),object對象typeof無法區(qū)分耍属。
3.instanceof 運(yùn)算符用于檢測構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個(gè)實(shí)例對象的原型鏈上(new String() instanceof String)托嚣。
4.Object.prototype.toString >>Object.prototype.toString('') =>[object Object

  • null和undefined分別代表意思?null == undefined厚骗?兩個(gè)等于和三個(gè)等于的區(qū)別示启?

null和undefined分別代表空值和未定義、null == undefined=true领舰、比較運(yùn)算符和相等運(yùn)算符

  • 什么是作用域夫嗓?作用域有那幾種迟螺?作用域鏈有什么特點(diǎn)?
var i = 5;  
function func() {  
    console.log(i);  
    if (true) {  
        var i = 6;  
    }  
}  
func(); // undefined

作用域:它是指對某一變量和方法具有訪問權(quán)限的代碼空間
作用域:作用域分為全局作用域和局部作用域
作用域鏈的特點(diǎn)就是啤月,先在自己的變量范圍中查找煮仇,如果找不到,就會(huì)沿著作用域往上找

// 作用域的特點(diǎn)就是谎仲,先在自己的變量范圍中查找浙垫,如果找不到,就會(huì)沿著作用域往上找郑诺。
var a = 1;
function b(){
    var a = 2;
    function c(){
        var a = 3;
        console.log(a);
    }
    c(); //3
}
b(); 

使用Es6的什么屬性能解決作用域問題夹姥?

let const 配合 塊級(jí)作用域

  • 什么是閉包?什么場景下使用閉包函數(shù)辙诞?使用ES6的屬性能解決辙售?
什么是閉包:閉包是指有權(quán)訪問另外一個(gè)函數(shù)作用域中的變量的函數(shù)
閉包函數(shù):避免全局污染、生成一個(gè)新的函數(shù)作用域
function outer() {
      var result = [];
      for (var i = 0飞涂; i<10; i++){
        result[i] = function (num) {
             return function() {
                   console.info(num);    // 此時(shí)訪問的num旦部,是上層函數(shù)執(zhí)行環(huán)境的num,數(shù)組有10個(gè)函數(shù)對象较店,每個(gè)對象的執(zhí)行環(huán)境下的number都不一樣
             }
        }(i)
     }
     return result
}
使用ES6的屬性能解決:let const
  • 什么是原型鏈士八?原型鏈的最頂層為什么?

在javascript中梁呈,實(shí)例對象與原型之間的鏈接婚度,叫做原型鏈。其基本思想是利用原型讓一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法官卡。然后層層遞進(jìn)蝗茁,就構(gòu)成了實(shí)例與原型的鏈條,這就是所謂原型鏈的基本概念
原型鏈的最頂層:為null

  • 原型鏈具體能干什么寻咒?

繼承

  • ES6語法可以實(shí)現(xiàn)繼承哮翘?

class 中的 extends

  • this指向問題?
function test(){
    var user = "中歐財(cái)富";
    console.log(this.user); //undefined
    console.log(this); //Window
}
test();
-----------------
var test1 = {
    user:'中歐財(cái)富',
    fn:function(){
        console.log(this.user);
    }
};
test1.fn(); //中歐財(cái)富
----------------
var test2 = {
     user:'中歐財(cái)富',
    fn:function(){
        console.log(this.user);
    }
};
const tempFn = test2.fn;
tempFn(); //window
//怎么解決this指向的問題毛秘?如何用ES6解決饭寺?
ES5解決方案:閉包
ES6解決方案:箭頭函數(shù)、bind
  • 聊一聊淺拷貝和深拷貝熔脂?

淺拷貝使用方法有:Object.assign()佩研、Array.prototype.slice、擴(kuò)展運(yùn)算符..

  • 深拷貝實(shí)現(xiàn)霞揉,遞歸實(shí)現(xiàn)深拷貝
function cloneObject(obj){
    var newObject = {};
    if(typeof obj !== object){
        return obj;
    }else{
        for(var attr in obj){
            newObject = cloneObject(obj[attr]);
        }
    }
    return newObject;
}
  • call和apply的區(qū)別旬薯,它們的作用是什么?

call:接受多個(gè)參數(shù)适秩、apply接受一個(gè)數(shù)組绊序;作用:指定執(zhí)行的上下文以及繼承硕舆;

事件

  • 什么是事件委托?事件委托的應(yīng)用場景骤公?
  1. 事件委托(delegate)也稱為事件托管或事件代理抚官,就是把目標(biāo)節(jié)點(diǎn)的事件綁定到祖先節(jié)點(diǎn)上
  2. 事件委托的應(yīng)用場景:處理多個(gè)相同元素綁定同一個(gè)事件,可以提升到父級(jí)元素處理
  • 什么是事件冒泡和事件捕獲

1.事件捕獲階段:事件從最上一級(jí)標(biāo)簽開始往下查找阶捆,直到捕獲到事件目標(biāo)(target)凌节。
2.事件冒泡階段:事件從事件目標(biāo)(target)開始,往上冒泡直到頁面的最上一級(jí)標(biāo)簽洒试。

瀏覽器

  • 瀏覽器解析網(wǎng)頁的工作原理倍奢?
  1. 瀏覽器一邊下載 HTML 網(wǎng)頁,一邊開始解析垒棋。也就是說卒煞,不等到下載完,就開始解析叼架。
  2. 解析過程中畔裕,瀏覽器發(fā)現(xiàn)<script>元素,就暫停解析乖订,把網(wǎng)頁渲染的控制權(quán)轉(zhuǎn)交給 JavaScript 引擎扮饶。
  3. 如果<script>元素引用了外部腳本,就下載該腳本再執(zhí)行垢粮,否則就直接執(zhí)行代碼贴届。
  4. JavaScript 引擎執(zhí)行完畢靠粪,控制權(quán)交還渲染引擎蜡吧,恢復(fù)往下解析 HTML 網(wǎng)頁。
  • 瀏覽器渲染引擎工作原理占键?
  1. 解析代碼:HTML 代碼解析為 DOM昔善,CSS 代碼解析為 CSSOM(CSS Object Model)。
  2. 對象合成:將 DOM 和 CSSOM 合成一棵渲染樹(render tree)畔乙。
  3. 布局:計(jì)算出渲染樹的布局(layout)。
  4. 繪制:將渲染樹繪制到屏幕牲距。
  • 重流和重繪
  1. 渲染樹轉(zhuǎn)換為網(wǎng)頁布局返咱,稱為“布局流”(flow);布局顯示到頁面的這個(gè)過程牍鞠,稱為“繪制”(paint)咖摹。它們都具有阻塞效應(yīng),并且會(huì)耗費(fèi)很多時(shí)間和計(jì)算資源难述。
  2. 頁面生成以后萤晴,腳本操作和樣式表操作吐句,都會(huì)觸發(fā)“重流”(reflow)和“重繪”(repaint)。用戶的互動(dòng)也會(huì)觸發(fā)重流和重繪店读,比如設(shè)置了鼠標(biāo)懸停(a:hover)效果嗦枢、頁面滾動(dòng)、在輸入框中輸入文本屯断、改變窗口大小等等文虏。
  3. 重流和重繪并不一定一起發(fā)生,重流必然導(dǎo)致重繪殖演,重繪不一定需要重流择葡。比如改變元素顏色,只會(huì)導(dǎo)致重繪剃氧,而不會(huì)導(dǎo)致重流敏储;改變元素的布局,則會(huì)導(dǎo)致重繪和重流朋鞍。
  • 什么是CORS已添,怎么解決CORS問題?
  1. CORS(跨域資源共享)滥酥、服務(wù)端配置Access-Control-Allow-Origin:*
  2. 使用其他方式解決JSONP
  3. 使用代理
  • http請求有那幾種更舞?常用的有哪幾種?Get和Post的區(qū)別坎吻?Get和POST應(yīng)用缆蝉?
  1. http請求有那幾種:GET、HEAD瘦真、POST刊头、PUT、DELETE诸尽、OPTIONS
  2. 常用的有哪幾種:GET和POSTo原杂,URL對鏈接有字符限制;POST:表單請求您机,對參數(shù)沒有限制穿肄;
  3. Get和POST應(yīng)用:Get一般用于無敏感并且參數(shù)少的功能、POST比GET稍微安全一點(diǎn)际看,可以用于登錄咸产、購買...
  • 是否了解發(fā)送請求的預(yù)檢請求,每一次請求一個(gè)接口總會(huì)多發(fā)出一個(gè)請求;

預(yù)檢查接口主要去詢問服務(wù)器是否支持當(dāng)前請求,如果不支持網(wǎng)頁會(huì)直接報(bào)錯(cuò)哗魂,如果支持直接返回結(jié)果蒙幻。

  • history的push和history的replace區(qū)別焚志,主要應(yīng)用在那一塊衣迷?
  1. push a->b->c ; 返回c->b-a;
  2. replace a-b-c; c->返回到更上級(jí);

存儲(chǔ)

  • cookie與Storage酱酬,什么是cookie?什么情況下使用Storage壶谒?

cookie使用一般在于老版本的瀏覽器使用,常見用的最多的是PC端膳沽,cookie容量4kb(保存數(shù)量15~20個(gè)左右)汗菜,主要用于保存用戶個(gè)性化信息,購物車
Storage 能存儲(chǔ)大量的數(shù)據(jù)挑社,適用于前端陨界;

異步操作

  • js處理異步操作的有那幾種方式?舉例:傳統(tǒng)的回調(diào)函數(shù)痛阻;
  1. 傳統(tǒng)的回調(diào)函數(shù)
  2. 事件監(jiān)聽(Events)
  3. Promise
  4. generator+回調(diào)函數(shù)
  5. generator+Promise
  6. async/await

怎么做前端的SEO

  • 設(shè)置TDK和服務(wù)端SSR的渲染菌瘪;

ES6

  • 說一下自己常用的es6功能?

const阱当、let俏扩、箭頭函數(shù)、字符串模版弊添、class录淡、extends.....

  • export和export default的區(qū)別?
export default  xxx
import xxx from './'
export xxx
import {xxx} from './'

業(yè)務(wù)

  • 能否講解一下你具體負(fù)責(zé)的這一塊的業(yè)務(wù)流程嗎油坝?
  • 如果交給你一個(gè)需求嫉戚,你應(yīng)該怎么去入手?
  • 日常開發(fā)中解決了什么業(yè)務(wù)難點(diǎn)問題澈圈?怎么解決的能細(xì)說嗎彬檀?
  • 日常開發(fā)中如何去排查和定位問題?
  • 請問一下你們公司的發(fā)布前端應(yīng)用的流程极舔?
  • 如何優(yōu)化PC端或者移動(dòng)端的性能凤覆?從那方面入手的链瓦?

上層應(yīng)用(框架)

  • 什么是SPA(單頁面應(yīng)用程序)拆魏,什么是MPA(多頁面應(yīng)用程序)?一般用于慈俯?

MPA:由多個(gè)完整頁面構(gòu)成渤刃、SAP:一個(gè)外殼頁面和多個(gè)頁面片段構(gòu)成
MPA:一般適用于PC(利于SEO)、SPA:一般適用于移動(dòng)端

  • 市面上的vuex贴膘、mobx卖子、redux...數(shù)據(jù)狀態(tài)管理庫作用是什么?它們的原理是什么刑峡?

根據(jù)使用者情況詳細(xì)了解洋闽;

  • 市面上的vue-router和react-router是通過什么實(shí)現(xiàn)的玄柠?

通過hash(location.hash+hashchange)、history(history.pushState()+popState)

  • 怎么對路由進(jìn)行按需加載诫舅?

react使用react-loadabl進(jìn)行路由按需加載羽利、import、require.ensure

  • 如果我想做權(quán)限管理刊懈,應(yīng)該怎么實(shí)現(xiàn)这弧?

路由守衛(wèi)(路由攔截)中處理。

  • 聊聊你們常用的基于HTTP網(wǎng)絡(luò)請求庫虚汛? 網(wǎng)絡(luò)請求庫中的發(fā)送http請求前事件和數(shù)據(jù)返回事件的應(yīng)場景匾浪?

網(wǎng)絡(luò)請求庫:axios、fetch
發(fā)送http請求前事件和數(shù)據(jù)返回事件:如:發(fā)送前合并參數(shù)卷哩、數(shù)據(jù)返回后對數(shù)據(jù)進(jìn)行處理等等...

組件

  • 現(xiàn)代的前端框架React蛋辈、Vue以及Angular為什么都要使用組件化的概念?

高復(fù)用将谊、可擴(kuò)展梯浪、易管理

  • 在開發(fā)過程中有對項(xiàng)目中的組件進(jìn)行分類嗎,比如:改變按鈕顏色的組件瓢娜,我們稱為功能性組件挂洛,請問你們也有類似的組件分類嗎?

ui組件眠砾、功能組件虏劲、業(yè)務(wù)組件

簡單算法

  • 數(shù)組去重
  var arr = ['1', '1', '2', '3', '4', '5', '6', '7', '7', '8'];
        //方案一
        function unique(arr) {
            var _tempArr = [];
            for (var i = 0; i < arr.length; i++) {
                if (_tempArr.indexOf(arr[i]) === -1) {
                    _tempArr.push(arr[i]);
                }
            }
            return _tempArr;
        }
        console.log(unique(arr));
        //方案二
        function unique1(arr) {
            for (var i = 0; i < arr.length; i++) {
                for (var j = i + 1; j < arr.length; j++) {
                    if (arr[i] === arr[j]) {
                        arr.splice(j, 1);
                        j--;
                    }
                }
            }
            return arr;
        }
        console.log(unique1(arr));
        //還有很多種排序方案
  • 數(shù)據(jù)倒序
 var arr = ['a', '1', '2', '3', '4', '5', '6', '7', '7', 'z','s'];
        //方案一
        function sort(arr) {
            var _tempArray = [];
            for (var i = arr.length - 1; i >= 0; i--) {
                _tempArray.push(arr[i]);
            }
            return _tempArray;
        }
        console.log(sort(arr));
        
        //方案二
        function sort1(arr) {
            for (var i = 0; i < (arr.length / 2); i++) {
                var temp = arr[i];
                arr[i] = arr[arr.length - i - 1];
                arr[arr.length - i - 1] = temp;
            }
            return arr;
        }
        console.log(sort1(arr));
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市褒颈,隨后出現(xiàn)的幾起案子柒巫,更是在濱河造成了極大的恐慌,老刑警劉巖谷丸,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堡掏,死亡現(xiàn)場離奇詭異,居然都是意外死亡刨疼,警方通過查閱死者的電腦和手機(jī)泉唁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揩慕,“玉大人亭畜,你說我怎么就攤上這事∮保” “怎么了拴鸵?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我劲藐,道長八堡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任聘芜,我火速辦了婚禮秕重,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厉膀。我一直安慰自己溶耘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布服鹅。 她就那樣靜靜地躺著凳兵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪企软。 梳的紋絲不亂的頭發(fā)上庐扫,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音仗哨,去河邊找鬼形庭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛厌漂,可吹牛的內(nèi)容都是我干的萨醒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼苇倡,長吁一口氣:“原來是場噩夢啊……” “哼富纸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起旨椒,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤晓褪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后综慎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涣仿,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年示惊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了好港。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涝涤,死狀恐怖媚狰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阔拳,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站糊肠,受9級(jí)特大地震影響辨宠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜货裹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一嗤形、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弧圆,春花似錦赋兵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拯田,卻和暖如春历造,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背船庇。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工吭产, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸭轮。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓臣淤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窃爷。 傳聞我的和親對象是個(gè)殘疾皇子荒典,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容