2016年BAT公司常見的Web前端面試題整理
1.JavaScript是一門什么樣的語言,它有哪些特點(diǎn)?
沒有標(biāo)準(zhǔn)答案。
2.JavaScript的數(shù)據(jù)類型都有什么?
基本數(shù)據(jù)類型:String,boolean,Number,Undefined
引用數(shù)據(jù)類型:Object(Array,Date,RegExp,Function,Null)
那么問題來了,如何判斷某變量是否為數(shù)組數(shù)據(jù)類型?
方法一.判斷其是否具有“數(shù)組性質(zhì)”,如slice()方法??勺约航o該變量定義slice方法,故有時(shí)會(huì)失效
方法二.obj instanceof Array 在某些IE版本中不正確
方法三.方法一二皆有漏洞,在ECMA Script5中定義了新方法Array.isArray(), 保證其兼容性,最好的方法如下:
3.已知ID的Input輸入框,希望改變文本框的背景顏色,怎么做?(原生JS)
4.希望獲取到頁(yè)面中所有的checkbox怎么做?(原生JS)
5.Html事件綁定有幾種方式?
直接在DOM里綁定事件:
這種方式稱為原生事件或者屬性事件
在JS里通過onclick綁定:xxx.onclick = test
Dom標(biāo)準(zhǔn)通過事件添加進(jìn)行綁定:addEventListener("click",test, false) //第三個(gè)參數(shù)為是否支持事件捕捉
IE事件:attachEvent("onclick",test)
那么問題來了,Javascript的事件流模型都有什么?
“事件捕捉”:事件由最不具體的節(jié)點(diǎn)先接收,然后逐級(jí)向下,一直到最具體的
目標(biāo)事件
“事件冒泡”:事件開始由最具體的元素接受,然后逐級(jí)向上傳播
“DOM事件流”:三個(gè)階段:事件捕捉,目標(biāo)階段,事件冒泡
IE事件流:目標(biāo)事件和事件冒泡
阻止事件冒泡的方式:
阻止事件的默認(rèn)行為:
6.看下列代碼,將會(huì)輸出什么?(變量聲明提升)
上面的代碼經(jīng)過變量提升后,等價(jià)于下面的代碼
再看下面的輸出結(jié)果:
此時(shí)打印a函數(shù),不會(huì)打印1,因?yàn)橄旅媸且粋€(gè)函數(shù)表達(dá)式,跟變量聲明一樣,只會(huì)把var a;提升到最前面,a=function(){}保留,會(huì)覆蓋前面的a=1;因此打印函數(shù)。
此題目,我再百度面試的時(shí)候問到過。
7.掌握樣式的優(yōu)先級(jí)。
!important > style(內(nèi)聯(lián)) > Id(權(quán)重100) > class(權(quán)重10) > 標(biāo)簽(權(quán)重1) 同類別的樣式,后面的會(huì)覆蓋前面的。
百度視頻部門一道面試題是這樣的:
8.怎樣添加、移除、移動(dòng)、復(fù)制、創(chuàng)建和查找節(jié)點(diǎn)
1)創(chuàng)建新節(jié)點(diǎn)
createDocumentFragment() //創(chuàng)建一個(gè)DOM片段
createElement() //創(chuàng)建一個(gè)具體的元素
createTextNode() //創(chuàng)建一個(gè)文本節(jié)點(diǎn)
2)添加、移除、替換、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替換
insertBefore() //插入
3)查找
getElementsByTagName() //通過標(biāo)簽名稱
getElementsByName() //通過元素的Name屬性的值
getElementById() //通過元素Id,唯一性
9.用js寫一個(gè)正則匹配標(biāo)簽中是否包含一個(gè)class(百度面試題)
10.事件循環(huán)綁定,輸出結(jié)果(考察閉包)
通過閉包封裝后的代碼:
閉包我所知道的兩個(gè)作用:
a.通過閉包可以把局部變量傳遞出來,就是通過閉包可以訪問函數(shù)內(nèi)部的變量,比如下面的代碼:
通過閉包就可以訪問函數(shù)內(nèi)部的局部變量,并且實(shí)現(xiàn)數(shù)量累加。
b.使用閉包可以避免空間污染,閉包內(nèi)部的變量都只能在內(nèi)部使用,這樣有效避免和外部變量的混淆。(個(gè)人理解)
11.js數(shù)組去重。
12.兩個(gè)div標(biāo)簽,如何控制標(biāo)簽左邊固定,右邊自適應(yīng),左邊div標(biāo)簽的寬度為100px(滴滴面試題)
滴滴面試起初問我,現(xiàn)在有并排的三個(gè)Div框,如何實(shí)現(xiàn)三個(gè)div都自適應(yīng),我當(dāng)時(shí)就懵了,這個(gè)考察的是display:table的使用
13.實(shí)現(xiàn)一個(gè)函數(shù)clone,可以對(duì)JavaScript中的5種主要的數(shù)據(jù)類型(包括Number、String、Object、Array、Boolean)進(jìn)行值復(fù)制
考察點(diǎn)1:對(duì)于基本數(shù)據(jù)類型和引用數(shù)據(jù)類型在內(nèi)存中存放的是值還是指針這一區(qū)別是否清楚
考察點(diǎn)2:是否知道如何判斷一個(gè)變量是什么類型的
考察點(diǎn)3:遞歸算法的設(shè)計(jì)
14.繼承的使用
15.請(qǐng)?jiān)u價(jià)以下代碼并給出改進(jìn)意見
評(píng)價(jià):
不應(yīng)該在if和else語句中聲明addListener函數(shù),應(yīng)該提前先聲明,定義全局變量;
不需要使用window.addEventListener或document.all來進(jìn)行檢測(cè)瀏覽器,應(yīng)該使用能力檢測(cè);
由于attachEvent在IE中有this指向問題,所以調(diào)用它時(shí)需要處理一下
改進(jìn)如下:
16.對(duì)作用域上下文和this的理解,看下列代碼:
推薦下我自己的前端群:595549645,不管你是小白還是大牛,小編我都挺歡迎,不定期分享干貨,包括我自己整理的一份2017最新的前端資料和零基礎(chǔ)入門教程,歡迎初學(xué)和進(jìn)階中的小伙伴。
如果想看到更加系統(tǒng)的文章和學(xué)習(xí)方法經(jīng)驗(yàn)可以關(guān)注我的微信公眾號(hào):‘web前端課程’關(guān)注后回復(fù)‘給我資料’可以領(lǐng)取一套完整的學(xué)習(xí)視頻