你們都知道‘不忘初心,方得始終’,但多少人知道‘初心易得,始終難守’。時代在變化,技術在發展,基礎沒變。學習新技術的時候,不該把基礎落下。javascript
由於機緣巧合,讓當了無數次面試者的我,當上了面試官,也和幾個面試者交流過。既然要應對面試者,我就固然要準備面試題了,好讓我大概知道面試者是什麼水平。這個時候,也該詳解下,本身的寫的那些題目。由於題目是我本身寫的,並非網上摘的,因此知識點比較基礎,也不全面。若是你們對面試題有什麼建議,歡迎指點。css
需求:定義‘我吃火鍋’html
面向過程的思想是:動做(我,吃火鍋)前端
代碼實現方面:vue
//面向過程
let eat=function(who,someThing){
console.log(`${who}吃${someThing}`);
}
eat('我','火鍋');//我吃火鍋
複製代碼
使用面向對象的方式改寫一下這個實例。java
這道題,只但願有一個面向對象的意思在這裏就好了,我期待的答案是這樣的。webpack
let person={
name:'守候',
eat:function(someThing){
console.log(`${this.name}吃${someThing}`);
}
}
person.eat('火鍋');
複製代碼
更好的方式看下面這篇文章:JavaScript:面試頻繁出現的幾個易錯點。這裏不展開講。css3
根據如下代碼,寫出結果es6
這道題我印象很深入,由於是我在一年多之前,在Q羣看到有人說直本身各類精通的時候,我就出這道題來提問,一抓一個準,至今那些各類精通的人,沒一個回答出來的。即便是面試題,也有人掉坑。web
以前發佈一篇文章的時候,有說起過這個面試題,也被人罵過,大概的意思是:如今都什麼年代了,ES都不知道更新多少版本了,誰還這麼寫代碼?看到這個我並無迴應,也沒打算和誰對撕。可是我腦子裏想到的第一件事就是:之前,新聞有條微博說70%網友同意數學退出高考,有人談定回答:數學就是用來淘汰這70%人的。在這裏我想說,雖然開發上這樣寫代碼確定會被批鬥,可是面試題,考的不僅是開發上遇到的問題,也有考一些基礎知識。這道題就是其中之一。並且,如今我也以爲還有必要知道這個知識,還沒到全民寫 ES6 的時代,拋棄 ES5 的時代。
alert(a)
a();
var a=3;
function a(){ alert(10) } alert(a) a=6;
a();
//------------分割線------------------
alert(a)
a();
var a=3;
var a=function(){ alert(10) } alert(a) a=6;
a(); 複製代碼
這個以前寫文章有寫過,如今賦值粘貼下。
考點其實就兩個,第一變量聲明提早,第二函數聲明優先於變量聲明!
下面我簡單分析一下,
第一部分運行結果:
1.函數聲明優先於變量聲明,因此,剛開始,a就是function a(){alert(10)}
,就會看到這個函數。
2.a()
,執行函數,就是出現alert(10)
3.執行了var a=3;
因此alert(a)
就是顯示3
4.因爲a
不是一個函數了,因此往下在執行到a()
的時候, 報錯。
第二部分運行結果:
1.underfind
2.報錯
在以前說過,預解析是把帶有var
和function
關鍵字的事先聲明,但不會賦值。因此一開始是underfind
,而後報錯是由於執行到a()
的時候,a
並非一個函數。
//函數表達式,和變量聲明同等
var a=function(){
alert(10)
}
//函數聲明,優於變量聲明
function a(){
alert(10)
} 複製代碼
一個簡單的需求,好比想給ul下面的li加上點擊事件,點擊哪一個li,就顯示那個li的innerHTML。這個貌似很簡單!代碼以下!
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<ul id="ul-test">
<li>0</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
</ul>
</body>
<script type="text/javascript"> var oUl=document.getElementById("ul-test"); var oLi=oUl.getElementsByTagName("li"); for(var i=0,len=oLi.length;i<len;i++){ oLi[i].addEventListener("click",function(){ alert(this.innerHTML) }) } </script>
</html>
複製代碼
問題在於:
1.for循環,循環的是li,10個li就循環10次,綁定10次事件,100個就循環了100次,綁定100次事件!
2.若是li不是原本就在頁面上的,是將來元素,是頁面加載了,再經過js動態加載進來了,上面的寫法是無效的,點擊li是沒有反應的!
應該怎麼解決以上問題?
在道題的考點就是事件委託,就是把事件綁在ul上面,以後的li就能夠隨便添加。代碼以下
var oUl=document.getElementById("ul-test");
oUl.addEventListener("click",function(ev){
var ev=ev||window.event;
var target=ev.target||ev.srcElement;
//若是點擊的最底層是li元素
if(target.tagName.toLowerCase()==='li'){
alert(target.innerHTML)
}
})
複製代碼
可是有些面試者就是從vue的角度回答這個問題--利用v-for進行綁定。雖然咱們公司的項目是使用vue,這樣說也沒錯,可是這道題我沒說起到vue,說vue的,反而就是一個扣分項了。
好比有一個需求,往ul裏面添加10個li,以下代碼
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<ul id="ul-test">
</ul>
</body>
<script type="text/javascript"> var oUl=document.getElementById("ul-test"); for(var i=0;i<10;i++){ var oLi=document.createElement('li'); oLi.innerHTML=i; oUl.appendChild(oLi); } </script>
</html>
複製代碼
問題:這裏至關於操做了10次DOM,有什麼方案,減小DOM的操做次數?可寫代碼簡單說明。
這道題,有幾我的仍是從vue的角度來解決問題(v-for,data),雖然這樣不能說錯,可是我題目沒說起vue的任何東西。考點就是利用innerHTML或者文檔碎片的形式。
代碼以下
var oUl=document.getElementById("ul-test");
//定義臨時變量
var _html='';
for(var i=0;i<10;i++){
//保存臨時變量
_html+='<li>'+i+'</li>'
}
//添加元素
oUl.innerHTML=_html;
複製代碼
var oUl=document.getElementById("ul-test"),_frag = document.createDocumentFragment();
for(var i=0;i<10;i++){
var oLi=document.createElement('li');
oLi.innerHTML=i;
//把元素添加進文檔碎片
_frag.appendChild(oLi);
}
//把文檔碎片添加進元素
oUl.appendChild(_frag);
複製代碼
寫出一個函數,實現對,對象的深拷貝
要求實現一個函數clone。
let obj={
name:'小明',
age:24
}
let obj1=clone(obj);
複製代碼
修改obj1,不會影響到obj的值。
這道題,在obj上面,我故意只寫一層,對象裏面沒有嵌套數組或對象,就是想看下面試者能不能往深處想一下。結果面試者都踩坑了。可是能夠理解,畢竟你們都是針對題目而論。
基本上回答都是相似下面這樣
function clone(object){
let _obj={}
for(let key in object){
_obj[key]=object[key];
}
return _obj;
}
let obj1=clone(obj);
//-------------------或者-------------
function clone(obj){
let _obj=Object.assign({},object);
return _obj;
}
let obj1=clone(obj);
複製代碼
這個方案,目的是達到了,可是若是obj裏面的屬性,嵌套着對象或者數組,這個就有問題了。因此理想的解決方案應該是這個。
function clone(object){
let _obj=JSON.parse(JSON.stringify(obj))
} 複製代碼
這種方案,若是須要屬性值是函數或者是undefined,就會被過濾掉。保險的作法是下面這樣。原理也很簡單,就是逐個遍歷,若是檢測到屬性值是時引用類型就用當前屬性進行遍歷。
function clone(obj){
if(!obj&& typeof obj!== 'object'){
return;
}
var newObj=obj.constructor===Object?{}:[];
for(var key in obj){
newObj[key] =(obj[key]&&typeof obj[key]==='object')?clone(obj[key]):obj[key];
}
return newObj;
}
複製代碼
其他幾道題都是比較籠統的題目,沒有惟一的解決方案,這裏就不統一回答了!
圖片,字體圖標代替,若是是比較小的英文字體可使用css3的@font-face。
性能優化-壓縮代碼,懶加載,預加載,合併請求,小圖片轉換base64編碼,資源按需加載等。
代碼質量優化-命名有意義,適當的註釋,避免巨大函數,避免對象強耦合,代碼邏輯清晰等。
參考資料以下:
ECMAScript 6 入門
30分鐘掌握ES6/ES2015核心內容(上)
30分鐘掌握ES6/ES2015核心內容(下)
實例感覺-es6的經常使用語法和優越性
ES6 Promise 用法講解
標籤語義化,class和id命名有意義而且命名統一規範,css避免深嵌套(3級就得注意),避免@import,!important,和*通配符,避免行內樣式,在head引入css等。
提升開發效率,有利團隊協同開發,
避免全局變量污染,命名衝突,
方便代碼的複用維護等。
面試題就是這10道,我本身的解決方案也說完了。雖熱咱們公司的技術棧用的主要是vue,webpack這一些,我面試交流的時候,也會問相關的問題,可是我在面試題裏面我不出關於vue,webpack這些題目,就問文章這些題目,就是想知道面試者的基礎如何(由於如今的行情,不少人都是注重學習熱門的框架,庫,工具等,卻把基礎落下了)。基礎好的話,框架不難上手,可是基礎不牢,就熟悉兩三的框架和一些構建工具,之後技術轉型可能會有阻力。如今前端的發展很快,技術很雜,可是基礎一直沒變。建議你們在學習新技術的同時,不要忘記鞏固基礎。
最後,若是你們對面試題有什麼解法建議或者建議出什麼題型,歡迎指點。
-------------------------華麗的分割線--------------------
想了解更多,關注關注個人微信公衆號:守候書閣