很多面試題是我自己面試BAT親身經曆碰到的。整理分享出來希望更多的前端er共同進步吧,不僅适用于求職者,對于鞏固複習js更是大有裨益。
而更多的題目是我一路以來收集的,也有往年的,答案不確定一定正确,如有錯誤或有更好的解法,還請斧正。
前面幾題是會很基礎,越下越有深度。
初級Javascript:
1.JavaScript是一門什麼樣的語言,它有哪些特點?
沒有标準答案。
2.JavaScript的資料類型都有什麼?
基本資料類型:String,Boolean,Number,Undefined, Null
引用資料類型:Object(Array,Date,RegExp,Function)
那麼問題來了,如何判斷某變量是否為數組資料類型?
方法一.判斷其是否具有“數組性質”,如slice()方法。可自己給該變量定義slice方法,故有時會失效
方法二.obj instanceof Array 在某些IE版本中不正确
方法三.方法一二皆有漏洞,在ECMA Script5中定義了新方法Array.isArray(), 保證其相容性,最好的方法如下:
3.已知ID的Input輸入框,希望擷取這個輸入框的輸入值,怎麼做?(不使用第三方架構)
4.希望擷取到頁面中所有的checkbox怎麼做?(不使用第三方架構)
5.設定一個已知ID的DIV的html内容為xxxx,字型顔色設定為黑色(不使用第三方架構)
6.當一個DOM節點被點選時候,我們希望能夠執行一個函數,應該怎麼做?
直接在DOM裡綁定事件:<div onclick=”test()”></div>
在JS裡通過onclick綁定:xxx.onclick = test
通過事件添加進行綁定:addEventListener(xxx, ‘click’, test)
那麼問題來了,Javascript的事件流模型都有什麼?
“事件冒泡”:事件開始由最具體的元素接受,然後逐級向上傳播
“事件捕捉”:事件由最不具體的節點先接收,然後逐級向下,一直到最具體的
“DOM事件流”:三個階段:事件捕捉,目标階段,事件冒泡
7.什麼是Ajax和JSON,它們的優缺點。
Ajax是異步JavaScript和XML,用于在Web頁面中實作異步資料互動。
優點:
可以使得頁面不重載全部内容的情況下加載局部内容,降低資料傳輸量
避免使用者不斷重新整理或者跳轉頁面,提高使用者體驗
缺點:
對搜尋引擎不友好(
要實作ajax下的前後退功能成本較大
可能造成請求數的增加
跨域問題限制
JSON是一種輕量級的資料交換格式,ECMA的一個子集
優點:輕量級、易于人的閱讀和編寫,便于機器(JavaScript)解析,支援複合資料類型(數組、對象、字元串、數字)
8.看下列代碼輸出為何?解釋原因。
解釋:Undefined是一個隻有一個值的資料類型,這個值就是“undefined”,在使用var聲明變量但并未對其指派進行初始化時,這個變量的值就是undefined。而b由于未聲明将報錯。注意未申明的變量和聲明了未指派的是不一樣的。
9.看下列代碼,輸出什麼?解釋原因。
解釋:null是一個隻有一個值的資料類型,這個值就是null。表示一個空指針對象,是以用typeof檢測會傳回”object”。
10.看下列代碼,輸出什麼?解釋原因。
undefined與null相等,但不恒等(===)
一個是number一個是string時,會嘗試将string轉換為number
嘗試将boolean轉換為number,0或1
嘗試将Object轉換成number或string,取決于另外一個對比量的類型
是以,對于0、空字元串的判斷,建議使用 “===” 。“===”會先判斷兩邊的值類型,類型不比對時為false。
那麼問題來了,看下面的代碼,輸出什麼,foo的類型為什麼?
執行完後foo的值為111,foo的類型為Number。
執行完後foo的值為1121(此處是字元串拼接),foo的類型為String。
11.看代碼給答案。
答案:2(考察引用資料類型細節)
12.已知數組var stringArray = [“This”, “is”, “Baidu”, “Campus”],Alert出”This is Baidu Campus”。
答案:alert(stringArray.join(" "))
那麼問題來了,已知有字元串foo="get-element-by-id",寫一個function将其轉化成駝峰表示法"getElementById"。
(考察基礎API)
13.var numberArray = [3,6,2,4,1,5]; (考察基礎API)
1) 實作對該數組的倒排,輸出[5,1,4,2,6,3]
2) 實作對該數組的降序排列,輸出[6,5,4,3,2,1]
14.輸出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,則輸出2014-09-26
15.将字元串”<tr><td>{$id}</td><td>{$name}</td></tr>”中的{$id}替換成10,{$name}替換成Tony (使用正規表達式)
答案:"<tr><td>{$id}</td><td>{$id}_{$name}</td></tr>".replace(/{\$id}/g, '10').replace(/{\$name}/g, ‘Tony’);
16.為了保證頁面輸出安全,我們經常需要對一些特殊的字元進行轉義,請寫一個函數escapeHtml,将<, >, &, “進行轉義
17.foo = foo||bar ,這行代碼是什麼意思?為什麼要這樣寫?
答案:if(!foo) foo = bar; //如果foo存在,值不變,否則把bar的值賦給foo。
短路表達式:作為"&&"和"||"操作符的操作數表達式,這些表達式在進行求值時,隻要最終的結果已經可以确定是真或假,求值過程便告終止,這稱之為短路求值。
18.看下列代碼,将會輸出什麼?(變量聲明提升)
答案:輸出undefined 和 2。上面代碼相當于:
函數聲明與變量聲明會被JavaScript引擎隐式地提升到目前作用域的頂部,但是隻提升名稱不會提升指派部分。
19.用js實作随機選取10--100之間的10個數字,存入一個數組,并排序。
20.把兩個數組合并,并删除第二個元素。
21.怎樣添加、移除、移動、複制、建立和查找節點(原生JS,實在基礎,沒細寫每一步)
1)建立新節點
createDocumentFragment() //建立一個DOM片段
createElement() //建立一個具體的元素
createTextNode() //建立一個文本節點
2)添加、移除、替換、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替換
insertBefore() //插入
3)查找
getElementsByTagName() //通過标簽名稱
getElementsByName() //通過元素的Name屬性的值
getElementById() //通過元素Id,唯一性
22.有這樣一個URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,請寫一段JS程式提取URL中的各個GET參數(參數名和參數個數不确定),将其按key-value形式傳回到一個json結構中,如{a:'1', b:'2', c:'', d:'xxx', e:undefined}。
答案:
23.正規表達式構造函數var reg=new RegExp("xxx")與正則表達字面量var reg=//有什麼不同?比對郵箱的正規表達式?
答案:當使用RegExp()構造函數的時候,不僅需要轉義引号(即\"表示"),并且還需要雙反斜杠(即\\表示一個\)。使用正則表達字面量的效率更高。
郵箱的正則比對:
24.看下面代碼,給出輸出結果。
答案:4 4 4。
原因:Javascript事件處理器線上程空閑之前不會運作。那麼問題來了,如何讓上述代碼輸出1 2 3?
25.寫一個function,清除字元串前後的空格。(相容所有浏覽器)
使用自帶接口trim(),考慮相容性:
26.Javascript中callee和caller的作用?
caller是傳回一個對函數的引用,該函數調用了目前函數;
callee是傳回正在被執行的function函數,也就是所指定的function對象的正文。
那麼問題來了?如果一對兔子每月生一對兔子;一對新生兔,從第二個月起就開始生兔子;假定每對兔子都是一雌一雄,試問一對兔子,第n個月能繁殖成多少對兔子?(使用callee完成)
中級Javascript:
1.實作一個函數clone,可以對JavaScript中的5種主要的資料類型(包括Number、String、Object、Array、Boolean)進行值複制
考察點1:對于基本資料類型和引用資料類型在記憶體中存放的是值還是指針這一差別是否清楚
考察點2:是否知道如何判斷一個變量是什麼類型的
考察點3:遞歸算法的設計
2.如何消除一個數組裡面重複的元素?
3.小賢是一條可愛的小狗(Dog),它的叫聲很好聽(wow),每次看到主人的時候就會乖乖叫一聲(yelp)。從這段描述可以得到以下對象:
小芒和小賢一樣,原來也是一條可愛的小狗,可是突然有一天瘋了(MadDog),一看到人就會每隔半秒叫一聲(wow)地不停叫喚(yelp)。請根據描述,按示例的形式用代碼來實。(繼承,原型,setInterval)
4.下面這個ul,如何點選每一列的時候alert其index?(閉包)
5.編寫一個JavaScript函數,輸入指定類型的選擇器(僅需支援id,class,tagName三種簡單CSS選擇器,無需相容組合選擇器)可以傳回比對的DOM節點,需考慮浏覽器相容性和性能。
答案:(過長,點選打開)
View Code
6.請評價以下代碼并給出改進意見。
評價:
不應該在if和else語句中聲明addListener函數,應該先聲明;
不需要使用window.addEventListener或document.all來進行檢測浏覽器,應該使用能力檢測;
由于attachEvent在IE中有this指向問題,是以調用它時需要處理一下
改進如下:
7.給String對象添加一個方法,傳入一個string類型的參數,然後将string的每個字元間價格空格傳回,例如:
addSpace("hello world") // -> 'h e l l o w o r l d'
接着上述答題,那麼問題來了
1)直接在對象的原型上添加方法是否安全?尤其是在Object對象上。(這個我沒能答出?希望知道的說一下。)
2)函數聲明與函數表達式的差別?
答案:在Javscript中,解析器在向執行環境中加載資料時,對函數聲明和函數表達式并非是一視同仁的,解析器會率先讀取函數聲明,并使其在執行任何代碼之前可用(可以通路),至于函數表達式,則必須等到解析器執行到它所在的代碼行,才會真正被解析執行。(函數聲明提升)
8.定義一個log方法,讓它可以代理console.log的方法。
可行的方法一:
如果要傳入多個參數呢?顯然上面的方法不能滿足要求,是以更好的方法是:
那麼問題來了,apply和call方法的異同?
對于apply和call兩者在作用上是相同的,即是調用一個對象的一個方法,以另一個對象替換目前對象。将一個函數的對象上下文從初始的上下文改變為由 thisObj 指定的新對象。
但兩者在參數上有差別的。對于第一個參數意義都一樣,但對第二個參數: apply傳入的是一個參數數組,也就是将多個參數組合成為一個數組傳入,而call則作為call的參數傳入(從第二個參數開始)。 如 func.call(func1,var1,var2,var3)對應的apply寫法為:func.apply(func1,[var1,var2,var3]) 。
9.在Javascript中什麼是僞數組?如何将僞數組轉化為标準數組?
僞數組(類數組):無法直接調用數組方法或期望length屬性有什麼特殊的行為,但仍可以對真正數組周遊方法來周遊它們。典型的是函數的argument參數,還有像調用getElementsByTagName,document.childNodes之類的,它們都傳回NodeList對象都屬于僞數組。可以使用Array.prototype.slice.call(fakeArray)将數組轉化為真正的Array對象。
假設接第八題題幹,我們要給每個log方法添加一個"(app)"字首,比如'hello world!' ->'(app)hello world!'。方法如下:
10.對作用域上下文和this的了解,看下列代碼:
問兩處 console 輸出什麼?為什麼?
答案是 1 和 undefined。
func 是在 winodw 的上下文中被執行的,是以會通路不到 count 屬性。
那麼問題來了,如何確定Uesr總是能通路到func的上下文,即正确傳回1。
答案:正确的方法是使用Function.prototype.bind。相容各個浏覽器完整代碼如下:
11.原生JS的window.onload與Jquery的$(document).ready(function(){})有什麼不同?如何用原生JS實作Jq的ready方法?
window.onload()方法是必須等到頁面内包括圖檔的所有元素加載完畢後才能執行。
$(document).ready()是DOM結構繪制完畢後就執行,不必等到加載完畢。
如果上述代碼十分難懂,下面這個簡化版:
12.(設計題)想實作一個對頁面某個節點的拖曳?如何做?(使用原生JS)
回答出概念即可,下面是幾個要點
給需要拖拽的節點綁定mousedown, mousemove, mouseup事件
mousedown事件觸發後,開始拖拽
mousemove時,需要通過event.clientX和clientY擷取拖拽位置,并實時更新位置
mouseup時,拖拽結束
需要注意浏覽器邊界的情況
13.
14.說出以下函數的作用是?空白區域應該填寫什麼?
答案:訪函數的作用是使用format函數将函數的參數替換掉{0}這樣的内容,傳回一個格式化後的結果:
第一個空是:arguments
第二個空是:/\{(\d+)\}/ig
15.用面向對象的Javascript來介紹一下自己。(沒答案哦親,自己試試吧)
答案: 對象或者Json都是不錯的選擇哦。
16.講解原生Js實作ajax的原理。
Ajax 的全稱是Asynchronous JavaScript and XML,其中,Asynchronous 是異步的意思,它有别于傳統web開發中采用的同步的方式。
Ajax的原理簡單來說通過XmlHttpRequest對象來向伺服器發異步請求,從伺服器獲得資料,然後用javascript來操作DOM而更新頁面。
XMLHttpRequest是ajax的核心機制,它是在IE5中首先引入的,是一種支援異步請求的技術。簡單的說,也就是javascript可以及時向伺服器提出請求和處理響應,而不阻塞使用者。達到無重新整理的效果。
XMLHttpRequest這個對象的屬性有:
onreadystatechang 每次狀态改變所觸發事件的事件處理程式。
responseText 從伺服器程序傳回資料的字元串形式。
responseXML 從伺服器程序傳回的DOM相容的文檔資料對象。
status 從伺服器傳回的數字代碼,比如常見的404(未找到)和200(已就緒)
status Text 伴随狀态碼的字元串資訊
readyState 對象狀态值
0 (未初始化) 對象已建立,但是尚未初始化(尚未調用open方法)
1 (初始化) 對象已建立,尚未調用send方法
2 (發送資料) send方法已調用,但是目前的狀态及http頭未知
3 (資料傳送中) 已接收部分資料,因為響應及http頭不全,這時通過responseBody和responseText擷取部分資料會出現錯誤,
4 (完成) 資料接收完畢,此時可以通過通過responseXml和responseText擷取完整的回應資料
下面簡單封裝一個函數:(略長,點選打開)
上述代碼大緻表述了ajax的過程,釋義自行google,問題未完,那麼知道什麼是Jsonp和pjax嗎?
Jsonp:(JSON with Padding)是一種跨域請求方式。主要原理是利用了script 标簽可以跨域請求的特點,由其 src 屬性發送請求到伺服器,伺服器傳回 js 代碼,網頁端接受響應,然後就直接執行了,這和通過 script 标簽引用外部檔案的原理是一樣的。JSONP由兩部分組成:回調函數和資料,回調函數一般是由網頁端控制,作為參數發往伺服器端,伺服器端把該函數和資料拼成字元串傳回。
pjax:pjax是一種基于ajax+history.pushState的新技術,該技術可以無重新整理改變頁面的内容,并且可以改變頁面的URL。(關鍵點:可以實作ajax無法實作的後退功能)pjax是<code>ajax</code>+<code>pushState</code>的封裝,同時支援本地存儲、動畫等多種功能。目前支援jquery、qwrap、kissy等多種版本。
覺得題目還ok的親點個推薦哦,題量會不斷增加。
暫且貼出我做出答案的部分。有時間把未做出答案也貼出來。針對文中各題,如有更好的解決方法或者錯誤之處,各位親務必告知我,誤人子弟實乃罪過。