筆者雖然曾經也面試過不少求職者,可是對於前端的筆試和麪試,我以爲並不能體現一我的的真實能力,因此建議你們多修煉前端真正的技術.對於前端面試題,以前也承諾過讀者要出一篇,筆者大體總結一下曾今面試的題目.後續不會再出面試題,而是聚焦於一些真正的,有利於成長性的技術文章和思惟方式,來幫助你們提升解決問題的能力. javascript
首先總結一下筆者對於前端領域學習的一些成長模型和學習路線,來給你們提供一些參考.css
下面推薦一些不一樣技術選型的優秀組件和庫,也是筆者曾今使用過的.接下來言歸正傳,開始進入正文.html
[參考答案]前端
0b
或者0B
)[參考答案]vue
介紹: Promise 是異步編程的一種解決方案,比傳統的解決方案——回調函數和事件——更合理和更強大。所謂Promise,簡單說就是一個容器,裏面保存着某個將來纔會結束的事件(一般是一個異步操做)的結果。從語法上說,Promise 是一個對象,從它能夠獲取異步操做的消息。Promise 提供統一的 API,各類異步操做均可以用一樣的方法進行處理。 狀態: pending(進行中)、fulfilled(已成功)和rejected(已失敗)。只有異步操做的結果,能夠決定當前是哪種狀態,任何其餘操做都沒法改變這個狀態。java
[參考答案]node
閉包就是可以讀取其餘函數內部變量的函數. 本質上,閉包是將函數內部和函數外部鏈接起來的橋樑.react
[參考答案]webpack
[參考答案] componentWillReceiveProps會在接收到新的props的時候調用css3
[參考答案]
[參考答案] 小程序原生頁面存在層級限制,超過必定層數就會沒法打開新頁面。一開始這個限制爲不超過5層,目前是不超過10層。
[參考答案]
// es5
Math.max.apply(null, arr);
// es6
Math.max(...arr);
複製代碼
[參考答案] HTTP客戶端通常對同一個服務器的併發鏈接個數都是有限制的, 最大爲6條
[參考答案]
[參考答案]
當瀏覽者訪問一個網頁時,瀏覽者的瀏覽器會向網頁所在服務器發出請求。當瀏覽器接收並顯示網頁前,此網頁所在的服務器會返回一個包含HTTP狀態碼的信息頭(server header)用以響應瀏覽器的請求。
[參考答案] rest請求方法有4種,包括get,post,put,delete.分別對應獲取資源,添加資源,更新資源及刪除資源.
[參考答案] React16.3+廢棄的三個生命週期函數
取而代之的是兩個新的生命週期函數
class ScrollingList extends React.Component {
constructor(props) {
super(props);
this.listRef = React.createRef();
}
getSnapshotBeforeUpdate(prevProps, prevState) {
// 返回的數據將做爲componentDidUpdate第三個參數
return {
stateA: 'xxx'
};
}
componentDidUpdate(prevProps, prevState, snapshot) {
if (snapshot !== null) {
console.log(snapshot.stateA)
}
}
render() {}
}
複製代碼
高階組件(HOC)是 React 中用於複用組件邏輯的一種高級技巧。HOC 自身不是 React API 的一部分,它是一種基於 React 的組合特性而造成的設計模式。具體而言,高階組件是參數爲組件,返回值爲新組件的函數.其自己是純函數,沒有反作用。
function logProps(WrappedComponent) {
return class extends React.Component {
componentWillReceiveProps(nextProps) {
console.log('Current props: ', this.props);
console.log('Next props: ', nextProps);
}
render() {
// 將 input 組件包裝在容器中,而不對其進行修改。Good!
return <WrappedComponent {...this.props} />; } } } 複製代碼
[參考答案]
headers字段 | 解釋 | 案例 |
---|---|---|
Expires | 服務端告訴瀏覽器,先把這個文件緩存起來,在這個過時時間以前,該文件都不會變化 | Expires: Mon, 1 Aug 2016 22:43:02 GMT |
Cache-Control | 因爲Expires給定的是絕對時間,而客戶端的系統時間能夠由用戶任意修改, Cache-Control爲相對時間 | Cache-Control: max-age=80 |
Last-Modified(response header) / If-Modified-Since (request header) | 服務端收到請求後會對比目前文件的最後修改時間和該請求頭的信息,若是沒有修改,那就直接返回304給瀏覽器,而不返回實際資源。若是有變化了,就返回200,而且帶上新的資源內容 | If-Modified-Since:Mon, 01 Aug 2016 13:48:44 GMT |
Etag / If-None-Match | 第一次請求後響應頭中包含了Etag,做爲時間標籤,下一次請求時會把原來的Etag標籤帶上(在請求頭中變成了If-None-Match)做爲校驗標準,若這個文件若是發生了改變,則Etag也會改變。服務器對比瀏覽器請求頭中的的If-None-Match:若是相同就返回304,而不返回實際資源若是不一樣,就返回200和新的資源。 |
[參考答案]
[參考答案]
progressive web app: 漸進式網頁應用.能夠將 Web 和 App 各自的優點融合在一塊兒:漸進式、可響應、可離線、實現相似 App 的交互、即時更新、安全、能夠被搜索引擎檢索、可推送、可安裝、可連接。其核心技術包括 App Manifest、Service Worker、Web Push,等等。
[參考答案]
同源策略/SOP(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能,若是缺乏了同源策略,瀏覽器很容易受到XSS、CSFR等攻擊, 同源策略要求兩個通信地址的協議、域名、端口號必須相同,不然兩個地址的通信將被瀏覽器視爲不安全的,並被阻擋下來. 要突破SOP的限制,咱們可使用以下方式:
res.setHeader("Access-Control-Allow-Origin","*");
// 不過CORS默認只支持GET/POST這兩種http請求類型,若是要開啓PUT/DELETE之類的方式,須要在服務端在添加一個"Access-Control-Allow-Methods"報頭標籤:
res.setHeader(
"Access-Control-Allow-Methods",
"PUT, GET, POST, DELETE, HEAD, PATCH"
)
複製代碼
HTML5 postMessage 可使用 postMessage 方法和 onmessage 事件來實現不一樣域之間的通訊,其中postMessage用於實時向接收信息的頁面發送消息
HTML5 WebSocket WebSocket protocol 是HTML5一種新的協議。它實現了瀏覽器與服務器全雙工通訊,同時容許跨域通信,是server push技術的一種很棒的實現
JSONP 是JSON的一種「使用模式」,主要是利用script標籤不受同源策略限制的特性,向跨域的服務器請求並返回一段JSON數據
iframe形式 經過設置相同的document.domain, 或者不一樣域經過window.name傳遞數據
服務器代理
[參考答案] response header響應頭
[參考答案]
CSRF, 跨站請求僞造,它能夠在用戶絕不知情的狀況下以用戶名義僞造請求發送給受攻擊站點,從而對用戶或者網站形成攻擊. 預防措施以下:
[參考答案]
// reduce
function flatten(arr = []) {
return arr.reduce((result, item) => {
return result.concat(Array.isArray(item) ? flatten(item) : item)
}, [])
}
// (toString | join) & split(利用數組的toString或者join,將數組轉化爲字符串)
function flatten(arr = []) {
return arr.toString().split(',').map(item => Number(item))
}
複製代碼
[參考答案]
相比於callback,Promise 具備更易讀的代碼組織形式(鏈式結構調用),更好的異常處理方式(在調用 Promise 的末尾添加上一個catch方法捕獲異常便可),以及異步操做並行處理的能力(Promise.all()Promise.race()等)。callback最大的問題就是咱們一般說的回調地獄,一旦業務邏輯複雜了,咱們不得不使用大量的嵌套回調代碼,可維護性很低.
[參考答案]
[參考答案]
[參考答案] 參考<趣談前端>週二打卡答案
[參考答案]
跨站請求僞造,能夠理解爲攻擊者盜用了用戶的身份,以用戶的名義發送惡意請求,形成用戶隱私及財產損失 過程: 1.登陸受信任網站並在本地生成cookie; 2.在不登出 網站 的狀況下訪問危險網站 防範: 關鍵操做只接受POST請求, 使用驗證碼, 檢測Referer, 使用token(或者JWT)
全稱Cross-site script,跨站腳本攻擊,是Web程序中常見的漏洞。原理是攻擊者向有XSS漏洞的網站中輸入惡意的腳本,當其它用戶瀏覽該網站時候,該腳本會自動執行,從而達到攻擊的目的(盜取Cookie,破壞頁面結構,重定向到釣魚網站等)。 區分: 分爲持久型XSS和非持久性XSS. 持久型XSS是將攻擊的腳本植入到服務器,從而致使每一個訪問的用戶都會遭到此XSS腳本的攻擊。非持久型XSS是將惡意腳本包裝在頁面的URL參數中,經過URL連接騙取用戶訪問,從而進行攻擊. 防範: 對用戶輸入進行HTML轉義, 對敏感信息進行過濾
經過把SQL命令插入到表單中並提交或頁面請求的參數中,最終使得服務器執行惡意的SQL命令. 防範: 對用戶的輸入進行校驗或限制長度;對特殊字符進行轉換, 不要使用動態拼裝SQL,爲每一個應用使用單獨的權限有限的數據庫鏈接。對隱私信息進行加密
分佈式拒絕服務(DDoS:Distributed Denial of Service)攻擊指藉助於客戶/服務器技術,將多個計算機聯合起來做爲攻擊平臺,對一個或多個目標發動DDoS攻擊,從而成倍地提升拒絕服務攻擊的威力。
[參考答案]
function getUniqueItems(arr, num) {
let temp = [];
for (let index in arr) {
temp.push(arr[index]);
}
let res = [];
for (let i = 0; i<num; i++) {
if (temp.length>0) {
let arrIndex = Math.floor(Math.random()*temp.length);
res[i] = temp[arrIndex];
temp.splice(arrIndex, 1);
} else {
break;
}
}
return res;
}
複製代碼
[參考答案] 事件委託, 冒泡觸發
[參考答案] 優勢:
[參考答案]
WebP是一種支持有損壓縮和無損壓縮的圖片文件格式,根據Google的測試,無損壓縮後的WebP比PNG 文件少了45%的文件大小,即便這些PNG文件通過其餘壓縮工具壓縮以後,WebP 仍是能夠減小28%的文件大小。
[參考答案]
從渲染的DOM來看,這二者都是連接,都是a標籤,區別是: Link是react-router裏實現路由跳轉的連接,配合Route使用,react-router攔截了其默認的連接跳轉行爲,區別於傳統的頁面跳轉,Link 的「跳轉」行爲只會觸發相匹配的Route對應的頁面內容更新,而不會刷新整個頁面。 a標籤是html原生的超連接,用於跳轉到href指向的另外一個頁面或者錨點元素,跳轉新頁面會刷新頁面。
[參考答案]
柯里化是一種將使用多個參數的一個函數轉換成一系列使用一個參數的函數的技術。柯里化函數可以讓咱們:
[參考答案]
[參考答案]
[參考答案]
object和Map存儲的都是鍵值對組合。區別:object的鍵的類型是字符串;map的鍵的類型能夠是任意類型;另外,object獲取鍵值使用Object.keys(返回數組)Map獲取鍵值使用map變量.keys() (返回迭代器)。
[參考答案]
(function (doc, win) {
var docEl = doc.documentElement,
resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
recalc = function () {
var clientWidth = docEl.clientWidth;
var fontSize = 20;
docEl.style.fontSize = fontSize + 'px';
var docStyles = getComputedStyle(docEl);
var realFontSize = parseFloat(docStyles.fontSize);
var scale = realFontSize / fontSize;
console.log("realFontSize: " + realFontSize + ", scale: " + scale);
fontSize = clientWidth / 750 * 20;
if(isIphoneX()) fontSize = 19;
fontSize = fontSize / scale;
docEl.style.fontSize = fontSize + 'px';
};
// Abort if browser does not support addEventListener
if (!doc.addEventListener) return;
win.addEventListener(resizeEvt, recalc, false);
doc.addEventListener('DOMContentLoaded', recalc, false);
// iphoneX判斷
function isIphoneX(){
return /iphone/gi.test(navigator.userAgent) && (screen.height == 812 && screen.width == 375)
}
})(document, window);
複製代碼
[參考答案]
function dropHash(url) {
let i = url.indexOf('#')
return i > -1 ? url.replace(/#/g, '') : url
}
複製代碼
[參考答案] redux經過制定一套嚴格的規範,提供一種規範式的api和使用方式來處理狀態, 適合大型項目和多人協同開發的項目,雖然代碼編寫有些繁複,但總體數據流向清楚,便於問題跟蹤和後期維護,而且支持狀態回溯.而window的變量管理比較混亂,維護不當還會形成變量污染,不適合中大型項目的開發.
[參考答案]
gulp | webpack | |
---|---|---|
定位 | 基於任務流的自動化打包工具 | 模塊化打包工具 |
優勢 | 易於學習和理解, 適合多頁面應用開發 | 能夠模塊化的打包任何資源,適配任何模塊系統,適合SPA單頁應用的開發 |
缺點 | 不太適合單頁或者自定義模塊的開發 | 學習成本低,配置複雜,經過babel編譯後的js代碼打包後體積過大 |
[參考答案]
瀏覽器的同源策略限制從一個源加載的文檔或腳本與來自另外一個源的資源進行交互,jsonp跨域本質上是經過動態script標籤, 本質上也是對靜態資源的訪問,因此只能是get請求
[參考答案]
棧內存中存放的是對象的訪問地址,在堆內存中爲這個值分配空間。這個值大小不固定,所以不能把它們保存到棧內存中。但內存地址大小的固定的,所以能夠將內存地址保存在棧內存中。這樣,當查詢引用類型的變量時,先從棧中讀取內存地址,而後再經過地址找到堆中的值。
[參考答案]
能夠經過閉包自執行函數實現塊做用域
[參考答案]
排序算法有:冒泡排序, 希爾排序, 快速排序, 插入排序, 歸併排序, 堆排序, 桶排序等.
經過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的全部數據都比另一部分的全部數據都要小,而後再按此方法對這兩部分數據分別進行快速排序,整個排序過程能夠遞歸進行,以此達到整個數據變成有序序列。
[參考答案] 從文件模塊緩存中加載 > 從原生模塊加載 > 從文件加載
[參考答案]
[參考答案]
[參考答案] vue中的數組的監聽不是經過Object.defineProperty來實現的,是經過對'push', 'pop','shift','unshift','splice', 'sort','reverse'等改變數組自己的方法來通知監聽的,因此直接給數組某一項賦值沒法監聽到變化,解決方案以下:
面試只是進入公司的第一步,如何走好它,須要自身的不斷努力和學習,因此不要沉迷於走捷徑,踏踏實實的學技術吧. 年前筆者會總結一下筆者2019年的技術成長與規劃, 但願能和你們繼續分享真正的前端技術.
若是想了解更多H5遊戲, webpack,node,gulp,css3,javascript,nodeJS,canvas數據可視化等前端知識和實戰,歡迎在公衆號《趣談前端》加入咱們一塊兒學習討論,共同探索前端的邊界。
年後公司因擴招須要2-3名熟悉react的工程師,座標上海, 有意者請聯繫我哈~