1. 程式人生 > >中級前端筆試面試題總結

中級前端筆試面試題總結

在網上找到一篇文章,裡面有一道面試題,考察了包括變數定義提升、this指標指向、運算子優先順序、原型、繼承、全域性變數汙染、物件屬性及原型屬性優先順序等許多知識點。
而就其中宣告提前相關的知識,我覺得也十分有參考價值:

function Foo() {
    getName = function () { alert (1); };
    return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}

// 請寫出以下輸出結果:
Foo.getName();
getName(); // 宣告提前
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();

這道題的答案是:2、4、1、1、2、3、3。

這裡考察宣告提前的題目在程式碼中已經標出,這裡宣告getName方法的兩個語句:

var getName = function () { alert (4) };
function getName() { alert (5) }

實際上在解析的時候是這樣的順序:

function getName() { alert (5) }
var getName;
getName = function () { alert (4) };

如果我們在程式碼中間再加兩個斷點:
getName(); // 5
var getName = function () { alert (4) };
getName(); // 4
function getName() { alert (5) }

在第一次getName時,function的宣告和var的宣告都被提前到了第一次getName的前面,而getName的賦值操作並不會提前,單純使用var的宣告也不會覆蓋function所定義的變數,因此第一次getName輸出的是function宣告的5; 而第二次getName則是發生在賦值語句的後面,因此輸出的結果是4,所以實際程式碼的執行順序是這樣:

function getName() { alert (5) }
var getName;
getName(); // 5
getName = function () { alert (4) };
getName(); // 4

2、瀏覽器儲存

localStorage,sessionStorage和cookie的區別

共同點:都是儲存在瀏覽器端、僅同源可用的儲存方式
1.資料儲存方面
•cookie資料始終在同源的http請求中攜帶(即使不需要),即cookie在瀏覽器和伺服器間來回傳遞。cookie資料還有路徑(path)的概念,可以限制cookie只屬於某個路徑下
•sessionStorage和localStorage不會自動把資料傳送給伺服器,僅在本地儲存。
2.儲存資料大小
•儲存大小限制也不同,cookie資料不能超過4K,同時因為每次http請求都會攜帶cookie、所以cookie只適合儲存很小的資料,如會話標識。
•sessionStorage和localStorage雖然也有儲存大小的限制,但比cookie大得多,可以達到5M或更大
3.資料儲存有效期
•sessionStorage:僅在當前瀏覽器視窗關閉之前有效;
•localStorage:始終有效,視窗或瀏覽器關閉也一直儲存,本地儲存,因此用作持久資料;
•cookie:只在設定的cookie過期時間之前有效,即使視窗關閉或瀏覽器關閉
4.作用域不同
•sessionStorage不在不同的瀏覽器視窗中共享,即使是同一個頁面;
•localstorage在所有同源視窗中都是共享的;也就是說只要瀏覽器不關閉,資料仍然存在
•cookie: 也是在所有同源視窗中都是共享的.也就是說只要瀏覽器不關閉,資料仍然存在

3、跨域

不久我寫了一個帖子,對同源策略及各種跨域的方式進行了總結: 什麼是跨域,為什麼瀏覽器會禁止跨域,及其引起的發散性學習

4、Promise的使用及原理

Promise是ES6加入的新特性,用於更合理的解決非同步程式設計問題,關於用法阮一峰老師在ECMAScript 6 入門中作出了詳細的說明,在此就不重複了。

30分鐘,讓你徹底明白Promise原理

上面這篇文章則是對Promise的原理進行的詳細的說明,在這裡,我提取最簡單的Promise實現方式來對Promise的原理進行說明:

function Promise(fn) {
    var value = null,
        callbacks = [];  // callbacks為陣列,因為可能同時有很多個回撥

    this.then = function (onFulfilled) {
        callbacks.push(onFulfilled);
    };

    function resolve(value) {
        callbacks.forEach(function (callback) {
            callback(value);
        });
    }

    fn(resolve);
}

首先, then 裡面宣告的單個或多個函式,將被推入 callbacks 列表,在Promise例項呼叫 resolve 方法時遍歷呼叫,並傳入 resolve 方法中傳入的引數值。

以下,使用一個簡單的例子來對Promise的執行流程進行分析:
fu

nctionm func () {
	return new Promise(function (resolve) {
		setTimeout(function () {
			resolve('complete')
		}, 3000);
	})
}

func().then(function (res) {
	console.log(res); // complete
})

func 函式的定義是返回了一個Promise例項,宣告例項時傳入的回撥函式加入了一個 resolve 引數(這個 resolve 引數在Promise中的 fn(resolve) 定義中獲取 resolve 的函式實體),回撥中執行了一個非同步操作,在非同步操作完成的回撥中執行了 resolve 函式。

再看執行步驟, func 函式返回了一個Promise例項,例項則可以執行Promise建構函式中定義的 then 方法, then 方法中傳入的回撥則會在 resolve (即非同步操作完成後)執行,由此實現了通過 then 方法執行非同步操作完成後回撥的功能。

5、JavaScript事件迴圈機制

原文中貼出的文章具有很大參考價值,先貼個連結: 詳解JavaScript中的Event Loop(事件迴圈)機制 。

JavaScript是一種單執行緒、非阻塞的語言,這是由於它當初的設計就是用於和瀏覽器互動的:
• 單執行緒: JavaScript 設計為單執行緒的原因是,最開始它最大的作用就是和 DOM 進行互動,試想一下,如果 JavaScript 是多執行緒的,那麼當兩個執行緒同時對 DOM 進行一項操作,例如一個向其新增事件,而另一個刪除了這個 DOM ,此時該如何處理呢?因此,為了保證不會 發生類似於這個例子中的情景, JavaScript 選擇只用一個主執行緒來執行程式碼,這樣就保證了程式執行的一致性。
• 非阻塞:當代碼需要進行一項非同步任務(無法立刻返回結果,需要花一定時間才能返回的任務,如I/O事件)的時候,主執行緒會掛起( pending )這個任務,然後在非同步任務返回結果的時候再根據一定規則去執行相應的回撥。而 JavaScript 實現非同步操作的方法就是使用Event Loop。

setTimeout(function () {
    console.log(1);
});

new Promise(function(resolve,reject){
    console.log(2)
    resolve(3)
}).then(function(val){
    console.log(val);
})

下面通過一段程式碼來分析這個問題,首先 setTimeout 和 Promise 中的 then 回撥都是非同步方法,而 new Promise 則是一個同步操作,所以這段程式碼應該首先會立即輸出 2 ; JavaScript 將非同步方法分為了 marco task (巨集任務:包括 setTimeout 和 setInterval 等)和 micro task (微任務:包括 new Promise 等),在 JavaScript 的執行棧中,如果同時存在到期的巨集任務和微任務,則會將微任務先全部執行,再執行第一個巨集任務,因此,兩個非同步操作中 then 的回撥會率先執行,然後才執行 setTimeout 的回撥,因此會依次輸出3、1,所以最終輸出的結果就是2、3、1。

6、ES6作用域及let和var的區別

這個問題阮一峰老師在ECMAScript 6 入門中的 let 和 const 命令 章節對這個問題作出了詳細的說明,下面提取一些我認為關鍵的點進行講解。

ES6引入了使用 {} 包裹的程式碼區域作為塊級作用域的宣告方式,其效果與ES5中 function 宣告的函式所生成的函式作用域具有相同的效果,作用域外部不能訪問作用域內部宣告的函式或變數,這樣的宣告在ES6中對於包括 for () {} 、 if () {} 等大括號包裹的程式碼塊中都會生效,生成一個單獨的作用域。

ES6新增的 let 宣告變數的方式相比 var 具有以下幾個重要特點:
• let 宣告的變數只在作用域內有效,如下方程式碼, if 宣告生成了一個塊級作用域,在這個作用域內宣告的變數在作用域外部無法訪問,假如訪問會產生錯誤:

if (true) {
	let me = 'handsome boy';
}
console.log(me); // ReferenceError
• let 宣告的變數與 var 不同,不會產生變數提升,如下方程式碼,在宣告之前輸出程式碼,會產生錯誤: 
// var 的情況
console.log(foo); // 輸出undefined
var foo = 2;

// let 的情況
console.log(bar); // ReferenceError
let bar = 2;
• let 的宣告方式不允許重複宣告,如重複宣告會報錯,而 var 宣告變數時,後宣告的語句會對先宣告的語句進行覆蓋: 
// 報錯
function func() {
  let a = 10;
  var a = 1;
}

// 報錯
function func() {
  let a = 10;
  let a = 1;
}
• 只要塊級作用域記憶體在 let 命令,它所宣告的變數就“繫結”( binding )這個區域,不再受外部的影響,這個特性稱為 暫時性死區 。 
var tmp = 123;

if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}

7、閉包

待補充

8、原型及原型鏈

待補充

9、瀏覽器的迴流與重繪 (Reflow & Repaint)

待補充

10、JS物件的深複製

一般的思路就是遞迴解決,對不同的資料型別做不同的處理:

function deepCopy (obj) {
  let result = {}
  for (let key in obj) {
    if (obj[key] instanceof Object || obj[key] instanceof Array) {
      result[key] = deepCopy(result[key])
    } else {
      result[key] = obj[key]
    }
  }
  return result
}

這個只能複製內部有陣列、物件或其他基礎資料型別的物件,假如有一些像 RegExp 、 Date 這樣的複雜物件複製的結果就是一個 {} ,無法正確進行復制,因為沒有對這些特殊物件進行單獨的處理。若

如果要複製的物件資料結構較為簡單,沒有複雜物件的資料,那麼可以用最簡便的方法:
let cloneResult = JSON.parse(JSON.stringify(targetObj))

瀏覽器相關

1、瀏覽器從載入到渲染的過程,比如輸入一個網址到顯示頁面的過程

載入過程:
•瀏覽器根據 DNS 伺服器解析得到域名的 IP 地址
•向這個 IP 的機器傳送 HTTP 請求
•伺服器收到、處理並返回 HTTP 請求
•瀏覽器得到返回內容

2、效能優化

待補充

Vue

1、元件間通訊方式

Vue的官方文件對元件間的通訊方式做了詳細的說明:cn.vuejs.org

父元件向子元件傳輸
• 最常用的方式是在子元件標籤上傳入資料,在子元件內部用 props 接收:

// 父元件
<template>
  <children name="boy"></children>
</template>

// 子元件:children
export default {
  props: {
    name: String
  }
}

• 還可以在子元件中用 this.$parent 訪問父元件的例項,不過官方文件有這樣一段文字,很好的說明了 $parent 的意義:節制地使用 $parent 和 $children —— 它們的主要目的是作為訪問元件的應急方法。更推薦用 props 和 events 實現父子元件通訊。

子元件向父元件傳輸
• 一般在子元件中使用 this.$emit(‘eventName’, ‘data’) ,然後在父元件中的子元件標籤上監聽 eventName 事件,並在引數中獲取傳過來的值。

// 子元件
export default {
  mounted () {
    this.$emit('mounted', 'Children is mounted.')
  }
}

// 父元件
<template>
  <children @mounted="mountedHandle"></children>
</template>

<script>
export default {
  methods: {
    mountedHandle (data) {
      console.log(data) // Children is mounted.
    }
  }
}
</script>

• 與 parentthis.parent 一樣,在父元件中可以通過訪問 this.children 來訪問元件的所有子元件例項。

總結
以上就是我要說的內容,希望以上的內容可以幫助到正在默默艱辛的大家,希望大家在往後的工作與面試中一切順利。
那如何學習才能快速入門並精通呢?
當真正開始學習的時候難免不知道從哪入手,導致效率低下影響繼續學習的信心。
但最重要的是不知道哪些技術需要重點掌握,學習時頻繁踩坑,最終浪費大量時間,所以有一套實用的視訊課程用來跟著學習是非常有必要的。
本次給大家推薦一個免費的學習群,裡面概括移動應用網站開發,css,html,webpack,vue node angular以及面試資源等。
對web開發技術感興趣的同學,歡迎加入Q群:866109386,不管你是小白還是大牛我都歡迎,還有大牛整理的一套高效率學習路線和教程與您免費分享,同時每天更新視訊資料。
最後,祝大家早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峰。

相關推薦

社招中級前端筆試試題總結

題目考察頻率指相關問題的考察頻率,並非只是提到的點。JavaScript基礎1、宣告提升類問題 (考察頻率:高)變數宣告和函式宣告都會提升,但函式會提升到變數前。 具體解釋可參考《你不知道的JavaScript(上卷)》2、js儲存方式(考察頻率:中)cookiesessionStoragelocalStor

中級前端筆試試題總結

在網上找到一篇文章,裡面有一道面試題,考察了包括變數定義提升、this指標指向、運算子優先順序、原型、繼承、全域性變數汙染、物件屬性及原型屬性優先順序等許多知識點。 而就其中宣告提前相關的知識,我覺得也十分有參考價值: function Foo() {

java筆試試題總結

linix 日誌 面試 arr java json數據 size 冒泡 格式 字符串如何倒序輸出? StringBuffer,String,StringBulider區別? Map與Hashmap 的關系? HashSet與HashTable 的關系? Map裏如何放li

2019校招前端筆試試題

01你做的頁面在哪些流覽器測試過?這些瀏覽器的核心分別是什麼? 答案 IE: trident核心 Firefox:gecko核心 Safari:webkit核心 Opera:以前是presto核心,Opera現已改用Google Chrome的Blink核心 Chr

【不定期更新】FPGA/IC崗位常見筆試試題總結

1 數字IC(ASIC)設計流程:   規格定製、詳細設計、HDL編碼、模擬驗證、邏輯綜合(產生網表)、靜態時序分析(STA)、形式驗證(對比綜合後網表與HDL設計功能是否一致)。之後包括佈局佈線(進行硬體模組和連線資源對映)等操作,最終生成驗證後的版圖檔案用於流片。其中綜合是劃分IC設計前端和後端的界限。

Web前端開發試題總結

1、簡單介紹一下什麼是盒模型? 網頁上的每一個標籤都是一個盒子,每個盒子都有四個屬性: 內容(content):盒子裡面裝的東西,網頁中通常是指文字和圖片(盒子中間裝的東西); 填充(padding):內邊距,比如買東西時怕盒子裡面的東西損壞而新增的泡沫或者其它抗震的輔料(盒子裡裝的

2018年web前端經典試題總結整理

對於很多同學來說,面試就是一個考驗,很多人技術上沒有任何問題,但是就是過補了面試那一關,那麼如何提升自己的面試機率呢?當然是瞭解一些面試題了,因為很多時候,一些我們忽略的小問題可能就是企業比較看重的,所以,今天給大家整理總結了一些面試題。希望可以對大家的面試有一定的幫助,可以讓大家更從容面對招聘者的考驗。

2018年web前端經典試題總結,你能做對幾個?

對程式設計師小哥哥小姐姐來說,很多時候差的不是技術,卻過不了面試那一關。這時候我們就需要總結分析一下面試題目了,揣摩公司與hr的心理及需求,有時候我們忽略的小問題就是決定能不能拿到offer的重要因素,希望大家都可以找到自己心儀的工作,從容應對面試~ 1、webpack怎麼引入第三方的庫?

STL筆試試題總結(乾貨)

STL筆試面試題總結 一.STL有哪些元件? STL提供六大元件彼此此可以組合套用: 1、容器 容器就是各種資料結構,我就不多說,看看下面這張圖回憶一下就好了,從實現角度看,STL容器是一種class template。 2、演算法 各種常見演算法,如sort,s

2018前端VUE試題總結

1、active-class是哪個元件的屬性?巢狀路由怎麼定義?答:vue-router模組的router-link元件。 2、怎麼定義vue-router的動態路由?怎麼獲取傳過來的動態引數? 答:在router目錄下的index.js檔案中,對path屬性加上/:id。 

BAT及各大網際網路公司2014前端筆試試題:JavaScript篇

很多面試題是我自己面試BAT親身經歷碰到的。整理分享出來希望更多的前端er共同進步吧,不僅適用於求職者,對於鞏固複習前端基礎更是大有裨益。 而更多的題目是我一路以來收集的,也有往年的,答案不確保一定正確,如有錯誤或有更好的解法,還請斧正。 前面幾題是會很基礎,越下越

BAT及各大網際網路公司2014前端筆試試題:HTML/CSS篇

很多面試題是我自己面試BAT親身經歷碰到的。整理分享出來希望更多的前端er共同進步吧,不僅適用於求職者,對於鞏固複習js更是大有裨益。 而更多的題目是我一路以來收集的,也有往年的,答案不確保一定正確,如有錯誤或有更好的解法,還請斧正。 前面幾題是會很基礎,越下越有深

BAT及各大網際網路公司2014前端筆試試題--JavaScript篇

function setcookie(name, value, days) { //給cookie增加一個時間變數    var exp = new Date();   exp.setTime(exp.getTime() + days * 24 * 60 * 60 * 100

BAT及各大網際網路公司2014前端筆試試題--Html,Css篇

1 /**HTML**/ 2 div.ani 3 4 /**css**/ 5 .ani{ 6 width:480px; 7 height:320px; 8

前端開發試題總結之—CSS3(附上答案)

相關知識點 佈局、 浮動、 盒子模型、 彈性和模型、 選擇器優先順序、 居中定位、 相容性、 hack寫法 題目以及答案 如何理解CSS的盒子模型? 每個HTML元素都是長方形盒子。 (1)盒子模型有兩種:IE盒子模型、標準W3C盒子模型;IE的c

筆試試題總結(一)--- 軟體開發

1.Huffman編碼中的貪心策略,該部分所需要的計算時間。 首先,要理解Huffman編碼中那部分用到了貪心演算法,貪心的策略,這樣才能求所需的計算時間。 哈夫曼編碼演算法:每次將集合中兩個權值最小

筆試試題總結(二)---軟體開發

1.PreparedStatement與Statement (1)PreparedStatement介面繼承Statement, PreparedStatement 例項包含已編譯的 SQL 語句,所以其執行速度要快於 Statement 物件。 (2)作為 Statem

web前端筆試試題整理

1.position的屬性值: relative absolut fixed static  (sticky page center瀏覽器暫時不支援)3.常見的設計模式:單利模式,簡單的工廠模式,觀察者模式 介面卡模式  代理模式 橋接模式 外觀模式 訪問者模式 中介者模式4

前端開發試題總結之——HTML

本文轉載於:猿2048網站➥前端開發面試題總結之——HTML ________________________________

java試題總結(二)--java中級試題 含答案

來自:https://www.cnblogs.com/tietazhan/articles/5771886.html   一、Java基礎 1. 例項方法和靜態方法有什麼不一樣? 2. Java中的異常有哪幾類?分別怎麼使用? 檢出異常,非檢出異常。檢出異常需要try.