❤,es6中的高階資料結構set和map的使用以及與es5中舊有的obj、array等結構的差別?
(1) Set構建函式可以接受一個陣列作為初始化引數
var s = new Set([1,2,3,4,`1`,`2`,`3`,`4`]);
(2) 有以下方法:add、delete、has、clear 作用如其名
(3) 可以用Array.from方法將Set結構轉換為陣列結構
var items = new Set([1,2,3,4,5]);
var new_array = Array.from( items );
(4) Set中每個元素只存在一個key
(4) es5中js物件只可以使用字串充當key值,一定程度上有限制。而Map結構就是為了解決這一問題。
(5) 可以接受一個二維陣列作為初始化引數
var s = new Map([["name","小明"],["title","Author"]])
//map.size //2
//map.has("name") //true
//map.get("name") //小明
❤,js中的this,比如es6箭頭函式中的this
比較基礎的來講,就是“指函式執行時,它的上一級物件,如果沒有上一級物件,則為最高層Window”。
當然1,需要區分strict模式,因為在strict模式中,this不會指到window,而是undefined。比如:
function abc(){
console.log(this);
}
或
var abc = function (){
console.log(this);
}
abc(); //非嚴格模式下返回 Window
//嚴格模式下返回 undefined
2,es6中箭頭函式會有所差異:”箭頭函式中的this,繼承父級執行上下文”。在定義的時候就已經被決定了,無論使用apply還是call都無法改變。(其實這個改變主要意義是為了向靜態化靠攏,因為大多數語言,比如java、php中的this,即和箭頭函式中的this指向一樣,而es5中非new+建構函式建立的函式的this,太特殊了),例子:
es5中:
var x=11;
var obj={
x:22,
say:function(){
console.log(this.x)
}
}
obj.say(); //22
而在es6中
var x=11;
var obj={
x:22,
say:()=>{
console.log(this.x);
}
}
obj.say(); //11
3,有一些方法可以改變this的指向,比如new+建構函式方式,比如apply與call等。比如:
var a=11
function test1(){
a=22;
let b=function(){
console.log(this.a);
};
b();
}
var x = new test1();//22
如果不使用建構函式,則:
var a=11
var test1 = {
a:22,
b:function(){
console.log(this.a);
}
}
var x = test1.b;
console.log(x());//11
//call和apply是Function物件的方法,兩個方法的作用是一樣的:
//call誰,apply誰,就把this指向誰。
//call與apply的區別就在於call的引數需要一個個傳,而apply接受一個陣列作為引數。
window.color = `red`;
document.color = `yellow`;
var s1 = {color: `blue` };
function changeColor(){
console.log(this.color);
}
changeColor.call(); //red (預設傳遞引數)
changeColor.call(window); //red
changeColor.call(document); //yellow
changeColor.call(this); //red
changeColor.call(s1); //blue
參考:https://www.cnblogs.com/pssp/… –https://blog.csdn.net/liwusen… – https://blog.csdn.net/ganying…
❤,前端開發幾種設計模式的概念,及典型使用場景。參考:http://garychang.cn/2017/01/1…
1,單例模式:宣告一個類,在其中使用閉包,那麼這個類中的變數是一直存在於記憶體中的,每次例項化這個類,都會去判斷記憶體中該類是否存在,即成為單例。參考,https://www.cnblogs.com/yongl…
2,觀察者模式:設計該模式背後的主要動力是促進形成鬆散耦合。在這種模式中,並不是一個物件呼叫另一個物件的方法,而是一個物件訂閱另一個物件的特定活動並在狀態改變後獲得通知。參考,https://www.cnblogs.com/haoyi…
3,工廠模式。
4,裝飾者模式。
and so on..
❤,mvvm和mvc的架構模式的概念和區別
(1) mvc:Model-View-Controller。 model是資料,view是使用者檢視層,controller是邏輯處理層。
(2) mvvm:Model-View-ViewModel。徹底切斷model和view層的聯絡,使用雙向繫結進行互動,view層如果修改,model層會修改,反之也會發生修改。比如AngularJs
❤,請寫出從”在瀏覽器輸入域名”到”頁面靜態資源完全載入”的整個過程
https://www.cnblogs.com/daiji… – https://segmentfault.com/a/11…
注:我注意到這裡是問”頁面靜態資源完全載入”,而不是”瀏覽器接收資料”,所以需要把瀏覽器解析html程式碼的過程也詳述進來,即引發面試官下一問題..
❤,瀏覽器載入檔案的方式(js是在所有靜態檔案下載完之後執行,還是下載完js即刻執行?2,<img>載入方式和js、css等一樣嗎)
https://segmentfault.com/a/11…
❤,氣泡排序演算法將以下陣列 var a = [B,A,E,C,D] 排序成a = [A,B,C,D,E]
1,冒泡演算法的思想是:每一次對比相鄰兩個資料的大小,小的排在前面,如果前面的資料比後面的大就交換這兩個數的位置。
2,使用string.charCodeAt()方法來判斷一個字元的ASCII碼數值。從A-Z,依次增加。
3,本題提到了”冒泡演算法”,那麼就認為不是要使用javascript原生的sort()方法,要自己封裝一個類似功能的方法或稱函式。
4,封裝冒泡演算法如下:
function sortage (arr)
{
for (let i = 0;i<arr.length-1;i++){
for (let j = i + 1;j<arr.length;j++){
if(arr[i].charCodeAt(0) > arr[j].charCodeAt(0)){
let temp_l = arr[j];
let temp_r = arr[i];
arr[i] = temp_l;
arr[j] = temp_r;
}
}
}
return arr;
}
let sampleArr = [`E`,`A`,`C`,`F`,`B`,`D`];
sortage(sampleArr);//[`A`,`B`,`C`,`D`,`E`,`F`]
❤,元件化思想是什麼意思,實際應用場景如何?與之相對應的典型前端架構思想是什麼?二者有何區別?
參考:https://www.jianshu.com/p/944…
❤,大概瞭解一下移動開發的幾種css佈局,比如css3新標準的flexible佈局和grid佈局等等
1,css2.1中的佈局方式:
1)block佈局:為了展示文件流。
2)inline佈局:為了展示文字。
3)table佈局:為了展示2D資訊資訊。
4)定位佈局:為了非常直接地定位元素而設計出來的佈局模式,定位元素基本與其他元素無關。
2,css3中引入了新的佈局模式:伸縮佈局,是為了呈現複雜的應用與頁面而設計出來的。
3,一個伸縮佈局,即Flexbox是由一個伸縮容器(flex containers)和在這個容器裡的伸縮專案(flex items)組成。
4,常見屬性:
1,flex-direction: row | row-reverse | column | column-reverse;決定浮動方向是橫向還是縱向。
2,flex-wrap: nowrap | wrap 決定是否換行顯示
3,flex-flow: <flex-direction> || <flex-wrap>
4,justify-content: flex-start | flex-end | center | space-between | space-around;專案在主軸上的對齊方式(主軸究竟是哪個軸要看屬性flex-direction的設定了),
5,flex: 比例佔用。舉例:
.main {
width: 600px;
}
.left {
flex: 1;
}
.right {
flex: 2;
}
是表示中間寬度為定寬600px,.left與.right按照1:2的比例佔用flex container的剩餘全部空間
參考:https://www.cnblogs.com/xuyun…
❤,React元件的生命週期
總體上分為三個狀態,以及分佈於其中的鉤子:
1,例項化(掛載)
getDefaultProps
getInitialState
componentWillMount
render
componentDidMount
2,存在期(執行)
componentWillReceiveProps
shouldComponentUpdate
componentWillUpdate
render
componentDidUpdate
3,銷燬&清理期
componentWillUnmount
參考:http://react-china.org/t/reac…
❤,React可控元件和非可控元件分別是什麼區別,一般使用場景是什麼
❤,頁面載入速度優化方法。倘若有1000萬使用者反映網頁顯示很”卡”(大於3s),如何針對此情況立項排查?
❤,前端安全有了解嗎。
常見的前端安全問題:
1,xss: 跨域指令碼攻擊
a,反射形:主要依靠站點服務端返回指令碼,在客戶端觸發執行從而發起Web攻擊。前端應對方案主要就是要過濾轉義後臺傳過來的標籤,比如script標籤,以及標籤屬性,比如onerror等屬性。後端反向一致。
b,儲存型:https://segmentfault.com/a/1190000011459463#articleHeader3
2,csrf: 跨站請求偽造
https://segmentfault.com/a/1190000011459463#articleHeader4
參考:https://segmentfault.com/a/11…
❤,AngularJs中雙向繫結的實現原理?髒值檢測呢?
雙向繫結是mvvm框架的核心特點。angular作為經典mvvm框架,它內部封裝了各種事件,例如click, settimeout,xhr response等。在其中觸發$digest迴圈,這個迴圈裡會遍歷$watch列表,只要其中有值發生改變,$digest就會遞迴觸發,比較舊值和新值,直到沒有值發生改變,完成最後一次$digest迴圈。這個時候更新檢視,使其與資料模型一致。髒值檢測的實現原理也在其中,只要$digest迴圈在進行,那麼就存在$dirty髒值。
❤,AngularJs中依賴注入的實現原理?html偽屬性指令呢?
依賴注入(Dependency Injection,簡稱DI)是c#、java等語言框架設計原則中”控制反轉”的典型案例。angular把它引入到js中。它實際工作的原理如下:
1,得到函式的依賴項(即引數)
使用Function.prototype.toString,得到函式的原始碼字串,然後解析其中的依賴項.
2,查詢依賴項所對應的物件。
在angular的一個物件陣列中找到這個物件即可
3,執行時注入:
通過 fn.apply方法把執行上下文,和依賴列表傳入函式並執行
angular指令本質上是對html的補充擴充套件。在angular執行的過程中,會啟動一個叫$compile的服務,這個服務會對dom樹進行遍歷,找到樹上所有的指令名,並且對應執行。
參考:https://www.cnblogs.com/etoah… –
❤,講一下你理解的promise。
Promise的誕生其實一開始是為了加強node後臺可讀性的:因為nodeJs以豐富的非同步處理而提高效率著稱,但是過多的非同步操作會降低程式碼的可讀性,於是在es6版本中Promise應運而生。
一般表示形式:
new Promise(
function(resolve, reject) {
if (/* success */) {
// ...執行程式碼
resolve();
} else { /* fail */
// ...執行程式碼
reject();
}
}
);
方法:
1,Promise.prototype.then()
2,Promise.prototype.catch()
and so on..
關於promise的resolve和reject以及promise狀態:
如果then()方法中返回了一個引數值,那麼返回的Promise將會變成接收狀態。
如果then()方法中丟擲了一個異常,那麼返回的Promise將會變成拒絕狀態。
如果then()方法呼叫resolve()方法,那麼返回的Promise將會變成接收狀態。
如果then()方法呼叫reject()方法,那麼返回的Promise將會變成拒絕狀態。
如果then()方法沒有明確指定的resolve(data)/reject(data)/return data時,那麼返回的新Promise就是接收狀態,可以一層一層地往下傳遞。
❤,Babel是如何編譯es6中的class的。
就是通過es5中 建構函式 + prototype原型鏈 繼承的方式來實現的。
參考:https://segmentfault.com/a/11…
❤,ES6中陣列和物件新增的常用操作方法。
❤,Jquery(或zepto)和Angular原始碼經典部分解析。