免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
jsliang 的 2019 面試準(zhǔn)備

Create by jsliang on 2019-2-11 15:30:34
Recently revised in 2019-3-17 21:30:36

Hello 小伙伴們,如果覺得本文還不錯,記得給個 star , 小伙伴們的 star 是我持續(xù)更新的動力!GitHub 地址

并不是只有特定的季節(jié)才能跑路,只因為人跑得多了,這條路就定下來了。

金三銀四跳槽季,jsliang2019年2月11日 寫下了這篇文章,開始準(zhǔn)備自己的面試之旅。

2019年3月17日 為止,jsliang 搭建出個人的面試知識體系,海量地翻閱了一些前輩留下的資料,結(jié)合個人需求進行了幾場面試,從而進一步完善該文章并進行了發(fā)表,希望對準(zhǔn)備跳槽或者正在跳槽中的小伙伴有所幫助。

一 目錄

不折騰的前端,和咸魚有什么區(qū)別

目錄
一 目錄
二 前言
?2.1 自我介紹
?2.2 跳槽原委
?2.3 進擊目標(biāo)
?2.4 開篇點題
三 HTML
?3.1 HTML 學(xué)習(xí)推薦
?3.2 HTML 語義化
?3.3 HTML5 新標(biāo)簽
?3.4 常見瀏覽器及其內(nèi)核
?3.5 cookies、session、sessionStorage、localStorage
四 CSS
?4.1 CSS 學(xué)習(xí)推薦
?4.2 CSS reset
?4.3 CSS 盒模型
?4.4 CSS 單位
?4.5 CSS 選擇器
?4.6 CSS 常見布局
?4.7 CSS3 新特性
?4.8 BFC
?4.9 行內(nèi)元素和塊級元素
?4.10 行內(nèi)樣式、內(nèi)嵌式、鏈接式以及導(dǎo)入式
?4.11 水平垂直居中
五 JavaScript
?5.1 JS 學(xué)習(xí)推薦
?5.2 JS 引用方式
?5.3 原型與原型鏈
?5.4 作用域與閉包
?5.5 淺拷貝與深拷貝
?5.6 模塊化與組件化
?5.7 面向?qū)ο笈c面向過程
?5.8 防抖與節(jié)流
?5.9 ES6
?5.10 數(shù)組操作
六 Vue
?6.1 MVVM
?6.2 生命周期
?6.3 雙向數(shù)據(jù)綁定
?6.4 Virtual DOM
?6.5 template 編譯
?6.6 key
?6.7 nextTick
?6.8 父子組件通訊
七 微信小程序
?7.1 文件主要目錄及文件作用
?7.2 微信小程序生命周期
?7.3 如何封裝數(shù)據(jù)請求
?7.4 頁面數(shù)據(jù)傳遞
?7.5 加載性能優(yōu)化的方法
?7.6 微信小程序與原生 APP、Vue、H5 差異
?7.7 微信小程序原理
八 瀏覽器
?8.1 瀏覽器解析 URL
?8.2 重繪與回流
?8.3 數(shù)據(jù)存儲
?8.4 內(nèi)存管理與垃圾回收
?8.5 內(nèi)存泄漏
九 網(wǎng)絡(luò)協(xié)議
?9.1 網(wǎng)絡(luò)分層
?9.2 HTTP/HTTPS
?9.3 HTTP 狀態(tài)碼
?9.4 TCP 三次握手與四次揮手
十 性能優(yōu)化
?10.1 HTML 優(yōu)化
?10.2 CSS 優(yōu)化
?10.3 JavaScript 優(yōu)化
十一 算法
十二 其他
十三 總結(jié)
十四 參考文獻
?14.1 關(guān)于面試
?14.2 關(guān)于 HTML
?14.3 關(guān)于 CSS
?14.4 關(guān)于 JS
?14.5 關(guān)于其他
十五 網(wǎng)友反饋

二 前言

返回目錄

請時刻準(zhǔn)備好自己的簡歷,不管是互聯(lián)網(wǎng)經(jīng)濟不佳面臨裁員,還是因為公司內(nèi)部斗爭嚴(yán)重心亂如麻,還是因為厭倦了目前的一切……只有隨時更新自己,把自己的簡歷準(zhǔn)備好,你才知道哪一刻跑路是最佳選擇。

2.1 自我介紹

返回目錄

Hello 小伙伴們好,我叫梁峻榮,網(wǎng)名叫 jsliang,由于崇拜前端大佬 技術(shù)胖jspang)的原因,又因為自己學(xué)的是前端(JavaScript),所以給自己取了個 jsliangJavaScriptLiang) 的網(wǎng)名,希望自己能通過建立自己的前端知識體系,從而在前端路上走得更遠。并將自己的經(jīng)驗分享給小伙伴,攜手小伙伴們一起前行。

下面是講講個人故事:

首先,jsliang 高考后的暑期就聽大學(xué)師兄的建議,開始學(xué)習(xí)編程,那時候?qū)W習(xí)了 C 語言,覺得世界上最神奇的事情不過如此,敲兩下鍵盤,按下回車,電腦就會一閃一閃地響應(yīng)我們!于是在大學(xué)的時候,陸陸續(xù)續(xù)學(xué)過 C、C#、.Net 等……。

-_-|| 由于學(xué)得都是基礎(chǔ),又都還給老師了,在這里就不多累述了。

然后,在大二就開始接觸 HTML,那時候選修了個《網(wǎng)頁設(shè)計基礎(chǔ)》,跟著老師做了個只有幾個頁面的靜態(tài)網(wǎng)站。在大三的時候,參加了學(xué)校的特訓(xùn)班,分角色按流程從頭到尾做了個包含角色管理、購物等功能的網(wǎng)站。同時,由于在特訓(xùn)班的時候,看到后端使用 ThinkPHP(簡稱 TP),覺得蠻不錯的,于是自己搗鼓,使用 TP 3.2.3 + Bootstrap 3 + MySQL 打造了自己的博客(已下線)。

接著,由于選修了門 Node.js 的課,所以也跟著大佬的步伐接觸了下 Vue、Koa 這些,那時候?qū)?npm 等諸多不懂,為了折騰這個,我的前端世界自此打開了個大門。

最后,我在自己的畢業(yè)設(shè)計中使用 Node.js + Vue + ElementUI + MongoDB 打造了個校園外賣、快遞代拿等功能的社區(qū)單頁應(yīng)用。

在 2018 年 5 月的時候,家里催促,于是直接出來面試。不像其他大佬的畢業(yè)等于失業(yè),很幸運地 jsliang 面試第一家就給了 offer,于是就進了這家公司,那時候感覺自己前面的大學(xué)生活白過了,只懂 ES5、jQuery、HTML/HTML5、CSS/CSS3 的皮毛。

在熟悉了三個月的業(yè)務(wù),公司給的任務(wù)能順利完成后,我覺得自己不夠努力:外面的前端翻天覆地,我的技術(shù)卻只是 jQuery is all!

于是 2018 年 8 月,jsliang 開始寫 Markdown,將 5 月份到 8 月份記錄到 Word 文檔上的筆記整理成了 jsliang 的文檔庫,并在 jsliang 的掘金 上發(fā)表了第一篇文章。

18 年 8 月至今,jsliang 大致經(jīng)歷了以下這些:

  1. 學(xué) Webpack,并用 Webpack 構(gòu)建一個多頁面配置。然后幸運的是,剛好碰到公司的一個仿站任務(wù),于是整個前端小組直接用了我的 Webpack + jQuery + VS Code 的 Live Share 套路進行協(xié)同開發(fā)!
  2. 學(xué) 微信小程序,并將它應(yīng)用到電信開發(fā)的微信小程序項目翼小微中。
  3. 學(xué) ECharts 報表,并用它做了個 Vue + ECharts 的報表,來展示愛音樂公司的運營數(shù)據(jù)。
  4. 學(xué) Node,然后搭了個企業(yè)網(wǎng)站(company.jsliang.top),并寫了篇小文章(目前最高成就,獲得了 1100 多贊)。
  5. 學(xué) Vue,由于之前學(xué)的 Vue,在工作上有好多沒有,逐漸淡忘了,所以從基礎(chǔ)開始,準(zhǔn)備寫一套《Vue 從 0 到 1》。

以上,就是 jsliang 的編程生涯。

今兒,在這里寫寫 jsliang 為了跳槽,根據(jù)個人想法進行的一些前端面試資料整理,小伙伴們覺得不錯的點個贊或者去 GitHub 點個 star,覺得有誤請指出,謝謝~

2.2 跳槽原委

返回目錄

馬老板曾經(jīng)說過,跳槽有兩個原因:

  1. 錢沒給到位。
  2. 心被委屈了。

首先,如果非要給 jsliang 我自己的跳槽定個位,那肯定是錢沒給到位,勞動與產(chǎn)出不成正比。在我 2018 年 5 月入職前,與人事的交談中了解到每年的 8 月和 2 月可以提薪,當(dāng)初的技術(shù)棧是:HTML、CSS、ES5。

然后,2018 年 6 月到 2019 年 1 月,學(xué)習(xí)并應(yīng)用到工作中的技術(shù)有:

  1. jQuery
  2. Webpack
  3. JSP
  4. 微信小程序
  5. Vue
  6. ECharts

其中 2018 年 8 月剛轉(zhuǎn)正,也不敢說自己技術(shù)進步很大,也不敢說自己項目貢獻很大,為公司謀了多大利益,所以沒有提薪想法。

2019 年 1 月底感覺自己項目也做了,凌晨 4/5/6 點的體育西路也看過了,技術(shù)也提升了,于是跟人事交談,期望 2 月能加薪,人事表示年終述職演講得好的給提薪,2 月開工的時候表示提薪名單沒我份……

你沒看錯,提薪全靠 PPT。PPT 里提高了不給,沒提就是沒有。
當(dāng)初想法很簡單,你隨便加個 5/600 我也滿足了。

最后,jsliang 曾跟項目總監(jiān)私下談話,建議可以發(fā)展一些新產(chǎn)品,這樣公司或許能獲取一些新收入,我也可以進一步挑戰(zhàn)我的技術(shù)。但是,由于我司是個老牌子公司,并且大部分依賴于接手電信項目進行擴張……

enm...所以心也委屈了。

在 2018 的努力下,GitHub 破 600 近 700 star,掘金破 10 萬閱讀量,3000 粉絲:
GitHub 見證:點擊查看
掘金見證:點擊查看

2.3 進擊目標(biāo)

返回目錄

  • 目標(biāo)城市:廣州
  • 目標(biāo)薪資:10K - 15K
  • 目標(biāo)技術(shù):
1. 熟悉 HTML/HTML5、CSS/CSS3、ES5/ES6。2. 了解 OOP 概念,并嘗試在工作中使用過 OOP 技巧。3. 對 MVC/MVVM 架構(gòu)有一定了解,如有 Vue/React/Angular 或者 微信小程序開發(fā)經(jīng)驗更佳。4. 使用過 Bootstrap 或者 ElementUI 等 UI 庫,并對前端 UI 庫有一定的個人理解。5. 了解 Git、Webpack 等工具。6. 對 Java、Node.js 等后端編程有一定了解。7. 一年及以上工作經(jīng)驗。復(fù)制代碼
  • 廣州前端分析:
  1. 廣州 13K 薪資要求:
    1. 2/3 年工作經(jīng)驗。
    2. 熟悉 OOP,并能在工作中使用,且能獨立開發(fā)插件等……
    3. 你可以不懂 Vue,但 React 你必須得會!
  2. 廣州 15k+ 薪資要求:
    1. 5 年+ 工作經(jīng)驗。
    2. 全能,懂前端,熟悉后端,能寫文檔……
    3. 帶領(lǐng)過小隊進行開發(fā)。
  3. 廣州異常偏科公司:
    1. 要求必須懂后端。
    2. 要求必須懂安卓或者 IOS 開發(fā)。
    3. 要求必須精通 jQuery 全家桶(jQuery UI、jQuery Mobile 等……)。

該分析數(shù)據(jù)來自 Boss 直聘

2.4 開篇點題

返回目錄

本文的知識點將涉及 HTML、CSS、JS、HTTP、Vue、Webpack、打包工具、性能優(yōu)化等,沒有前置條件,看得懂可以瞅瞅復(fù)習(xí)下,看不懂可以瞅瞅?qū)W習(xí)下。

關(guān)于面試,在這記下慕課網(wǎng)視頻看到的,個人非常認(rèn)同的三個問答:

  • 問:拿到一個面試題,第一時間看到什么? 答:考點
  • 問:如何看待網(wǎng)上搜出來的永遠看不完的題海? 答:不變應(yīng)萬變
  • 問:如何對待面試題? 答:題目到知識再到題目

然后在復(fù)習(xí)面試題的過程中,個人有些小看法:

  • 個人感言一:為什么我總是比不上別人優(yōu)秀?

當(dāng)編寫業(yè)務(wù)代碼中,碰到某個業(yè)務(wù) bug 時,我會習(xí)慣性地百度這個業(yè)務(wù) bug,看看網(wǎng)友是怎么解決的。但是,學(xué)霸級的程序猿,會多走一步,他們會思考產(chǎn)生這個業(yè)務(wù) bug 的底層原因是什么,下次碰到類似的是如何應(yīng)用該技術(shù)解決。所以,日積月累,我的確比不上人家了。

  • 個人感言二:辭職并不是件便捷的事。

way 1:面試成功,跟自己公司遞辭呈,走流程,同時跟對面 hr 申請一個月后入職。

way 2:面試成功,跟自己公司遞辭呈,詢問能不能快速離職,收到回復(fù)跟對面 hr 確認(rèn)時間?!就扑]】

way 3:先遞辭呈,同時面試,面試成功的,一律申請走完原公司一個月的流程之后的日子入職。

jsliang 于 2 月底拿到 offer 并遞交辭呈,3 月 - 4 月進入一個月倒計時,4 月第一周才能拿到離職證明。

最后在這里祝各位小伙伴能找到稱心如意的工作~

三 HTML

返回目錄

HTML 屬于結(jié)構(gòu)層,負責(zé)描繪出內(nèi)容的結(jié)構(gòu)。

CSS 屬于表示層,負責(zé)如何顯示有關(guān)內(nèi)容。

JavaScript 屬于行為層,負責(zé)內(nèi)容應(yīng)如何對事件做出反應(yīng)。

3.1 HTML 學(xué)習(xí)推薦

返回目錄

3.2 HTML 語義化

返回目錄

語義化的含義就是用正確的標(biāo)簽做正確的事情,HTML 語義化就是讓頁面的內(nèi)容結(jié)構(gòu)化,它有如下優(yōu)點:

  1. 便于對瀏覽器、搜索引擎解析;
  2. 便于盲人瀏覽網(wǎng)頁;
  3. 便于閱讀源代碼的人對網(wǎng)站進行分開,維護和理解;

簡單來說,能用 <header>、<footer> 等 H5 新標(biāo)簽的就不用 <div class='header'>,不要使用 <div> 來存放段落等……

3.3 HTML5 新標(biāo)簽

返回目錄

HTML5 中新增標(biāo)簽大致有:<header>、<footer><aside>、<nav><video><audio>、<canvas>等等。

3.4 常見瀏覽器及其內(nèi)核

返回目錄

ChromeFirefoxSafariIEOpera
排版引擎BlinkGeckoWebkitTridentBlink
JS 引擎V8SpiderMonkeyNitroChakraV8

國內(nèi)一些瀏覽器使用較多的是 Webkit 內(nèi)核。

  • 針對不同瀏覽器內(nèi)核,HTML 辨別:
  1. IE 內(nèi)核瀏覽器識別:<!--[if IE]><![endif]-->
  2. 非 IE 內(nèi)核瀏覽器識別:<!--[if !IE]><![endif]-->
  • 針對不同瀏覽器內(nèi)核,CSS 辨別:
/* 設(shè)置文字不可選取 */* {  -moz-user-select: none; /* 火狐 瀏覽器 */  -webkit-user-select: none; /* Webkit 瀏覽器 */  -o-user-select: none; /* Opera 瀏覽器 */  -ms-user-select: none; /* IE10 瀏覽器 */  -khtml-user-select: none; /* 早期瀏覽器 */  user-select: none; /* 默認(rèn) */}復(fù)制代碼

3.5 cookies、session、sessionStorage、localStorage

返回目錄

  • cookies:存儲于瀏覽器端的數(shù)據(jù)??梢栽O(shè)置 cookies 的到期時間,如果不設(shè)置時間,則在瀏覽器關(guān)閉窗口的時候會消失。

  • session:存儲于服務(wù)器端的數(shù)據(jù)。session 存儲特定用戶會話所需的屬性和配置信息。

  • cookiessession 的區(qū)別在于:

  1. cookies 數(shù)據(jù)存放在客戶的瀏覽器上,session 數(shù)據(jù)存放在服務(wù)器上。
  2. 前端都是裸君子,沒有安全可言,cookies 可能會被黑客利用作數(shù)據(jù)欺騙。所以重要信息記得存 session。
  3. session 如果在生效期內(nèi)量過大,會占用服務(wù)器性能。
  4. 單個 cookies 保存的數(shù)據(jù)不能超過 4 K,很多瀏覽器限制一個站點保存最多 20 個 cookies。

  • sessionStorage:生命周期存在于標(biāo)簽頁或窗口,用于本地存儲一個會話(session)中的數(shù)據(jù),這些數(shù)據(jù)會隨著窗口或者標(biāo)簽頁的關(guān)閉而被清空。

  • localStorage:生命周期是永久的,除非用戶主動清除瀏覽器上存儲的 localStorage 信息,否則它將會永久存在。

  • sessionStoragelocalStorage 操作方法:setItemgetItem 以及 removeItem。

以 localStorage 為例:

localStorage.getItem('name'); // 獲取 name 的值localStorage.setItem('name', 'jsliang'); // 設(shè)置 name 的值為 jslianglocalStorage.removeItem('name'); // 刪除 name 的值復(fù)制代碼

參考 1:《前端分享之cookie的使用及單點登錄》
參考 2:《Cookie、session和localStorage、以及sessionStorage之間的區(qū)別》

四 CSS

返回目錄

HTML 屬于結(jié)構(gòu)層,負責(zé)描繪出內(nèi)容的結(jié)構(gòu)。

CSS 屬于表示層,負責(zé)如何顯示有關(guān)內(nèi)容。

JavaScript 屬于行為層,負責(zé)內(nèi)容應(yīng)如何對事件做出反應(yīng)。

4.1 CSS 學(xué)習(xí)推薦

返回目錄

4.2 CSS reset

返回目錄

在工作的過程中,會發(fā)現(xiàn)各式各樣的瀏覽器對某個標(biāo)簽有自己獨特的樣式。

但是在前端開發(fā)中,如果不采用統(tǒng)一標(biāo)準(zhǔn),那么會產(chǎn)生千奇百怪的 bug。所以為了減少后期 bug 的出現(xiàn),前端開發(fā)人員會重置一遍 CSS 樣式,盡可能地使開發(fā)的網(wǎng)頁在各個瀏覽器相差不大。

下面是 jsliang 在使用的樣式重置,當(dāng)然如果小伙伴有不同的想法,可以去 百度/必應(yīng)/google 搜索并使用其他版本的樣式重置:

4.3 CSS 盒模型

返回目錄

在工作的過程中,也許小伙伴需要 div 塊的總寬度為 100px,然后發(fā)現(xiàn)總是被 margin 撐高,這是因為盒模型定義的問題:

CSS 中有個屬性叫 box-sizing。

box-sizing: border-boxbox-sizing: content-box復(fù)制代碼
  1. border-box 中,整個 div 的寬、高,包括 marginpadding、border
  2. content-box 中,整個 div 的寬、高,則不包括上面元素。

如上圖,如果一個 div ,你的代碼如下:

div { box-sizing: border-box; margin: 10px; width: 100px; height: 100px; padding: 10px;}復(fù)制代碼

那么,你的整個寬高還是 100px

但是,如果你的代碼如下:

div {  box-sizing: content-box;  margin: 10px;  width: 100px;  height: 100px;  padding: 10px;}復(fù)制代碼

那么,你的整個盒子寬高是 120px。

如果你在設(shè)計頁面中,發(fā)現(xiàn)內(nèi)容區(qū)被撐爆了,那么,請檢查下現(xiàn)在的 border-box 是什么,最好在引用 reset.css 的時候,就對 border-box 進行統(tǒng)一設(shè)置,方便管理。

4.4 CSS 單位

返回目錄

在 CSS 中,除了我們常用的 px,還有其他單位小伙伴們可以了解一下:

單位描述
%百分比
px像素。計算機屏幕上的一個點為 1px。
em相對單位。相對于父元素計算,假如某個 p 元素為 font-size: 12px,在它內(nèi)部有個 span 標(biāo)簽,設(shè)置 font-size: 2em,那么,這時候的 span 字體大小為:12 * 2 = 24px
rem相對單位。相對于根元素 html 的 font-size,假如 html 為 font-size: 12px,那么,在其當(dāng)中的 div 設(shè)置為 font-size: 2rem,就是當(dāng)中的 div 為 24px
rpx微信小程序相對單位。1rpx = 屏幕寬度 / 750 px。在 750px 的設(shè)計稿上,1rpx = 1px。

除此之外還有 pt、ex 等單位,但由于不太好換算,故在此不提。

4.5 CSS 選擇器

返回目錄

選擇器是匹配元素的一種模式。

  • 關(guān)于 CSS 解析器:

HTML 經(jīng)過解析生成 DOM Tree;而在 CSS 解析完畢后,需要將解析的結(jié)果與 DOM Tree 的內(nèi)容一起進行分析建立一棵 Render Tree,最終用來進行繪圖。

Render Tree 中的元素與 DOM 元素相對應(yīng),但非一一對應(yīng):一個 DOM 元素可能會對應(yīng)多個 renderer,如文本折行后,不同的「行」會成為 render tree 種不同的 renderer。也有的 DOM 元素被 Render Tree 完全無視,比如 display:none 的元素。

在建立 Render Tree 時,瀏覽器就要為每個 DOM Tree 中的元素根據(jù) CSS 的解析結(jié)果來確定生成怎樣的 renderer。對于每個 DOM 元素,必須在所有 Style Rules 中找到符合的 selector 并將對應(yīng)的規(guī)則進行合并。選擇器的「解析」實際是在這里執(zhí)行的,在遍歷 DOM Tree 時,從 Style Rules 中去尋找對應(yīng)的 selector。

  • CSS 解析順序

在 CSS 的選擇器中,它會按照優(yōu)先級 從右向左解析,因為這樣匹配元素的時候,能盡量少地查找,所以選擇器最好寫地簡潔一點。

  • CSS 常用選擇器
  1. 通配符:*
  2. ID 選擇器:#ID
  3. 類選擇器:.class
  4. 元素選擇器:p、a 等……
  5. 后代選擇器:p spandiv a 等……
  6. 偽類選擇器:a:hover 等……
  7. 屬性選擇器:input[type='text'] 等……
  8. 子元素選擇器:li:firth-child、p:nth-child(1) 等……
  • CSS 選擇器權(quán)重

!important -> 行內(nèi)樣式 -> #id -> .class -> 元素和偽元素 -> * -> 繼承 -> 默認(rèn)

4.6 CSS 常見布局

返回目錄

  1. 水平垂直居中。這種布局老生常談,jsliang 在本文也有提到,詳解請 點擊鏈接
  2. 兩列布局。一側(cè)固定,另一側(cè)自適應(yīng)。
<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <meta name='viewport' content='width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no'> <meta http-equiv='X-UA-Compatible' content='ie=edge'> <title>Two Column Layout</title> <style> .container { display: flex; } .child-one { width: 300px; height: 300px; background: red; } .child-two { width: 100%; height: 300px; background: deepskyblue; } </style></head><body> <div class='container'> <div class='child-one'></div> <div class='child-two'></div> </div></body></html>復(fù)制代碼
  1. 三列布局。類似于兩列布局,新增多一個固定寬的 <div> 塊而已。當(dāng)然,小伙伴們可能會說:jsliang 你要考慮 flex 的兼容性啊!enm...支持所有最新版本的瀏覽器!請更新你的瀏覽器哦親~

避免被寄刀片,附上 float 布局:《css常見布局》

4.7 CSS3 新特性

返回目錄

經(jīng)典:CSS3 相關(guān)屬性你了解嗎,說說都有哪些?能說說你工作中常用的一些 CSS3 屬性嗎?

那么,CSS3 新特性都有哪些呢?

  • transition:過渡
  • transform:旋轉(zhuǎn)、縮放、移動或者傾斜
  • animation:動畫
  • gradient:漸變
  • shadow:陰影
  • border-radius:圓角

為了方便記憶,咱將它們?nèi)拥酵粋€ HTML 文件上,小伙伴拷貝到本地上打開,可以看到一個擁有漸變的小球,做著橫向運動,如果你鼠標(biāo)移動到它上面,它的寬度會放大,并且進行傾斜。

<!DOCTYPE html><html><head><meta charset='utf-8'> <title>CSS3 新特性</title><style>   div {    width: 100px;    height: 100px;    border-radius: 50px;    background: linear-gradient(red, orange);    box-shadow: 10px 10px 5px #888888;    position: relative;    transition: width 2s;    animation: mymove 5s infinite;  }  div:hover {    width:300px;    transform: rotate(7deg);  }  @keyframes mymove {    from { left: 0px; }    to { left: 200px; }  }</style></head><body>  <div></div></body></html>復(fù)制代碼

參考 1:《CSS3 圓角》
參考 2:《CSS3 漸變(Gradients)》
參考 3:《CSS3 transition 屬性》
參考 4:《CSS3 transform 屬性》
參考 5:《CSS3 animation(動畫) 屬性》
參考 6:《CSS3 box-shadow 屬性》
參考 7:《個人總結(jié)(css3新特性)》

4.8 BFC

返回目錄

  • 什么是 BFC?

BFC 就是 塊級格式上下文,它是一個獨立的渲染區(qū)域,讓處于 BFC 內(nèi)部的元素和外部的元素相互隔離,使內(nèi)外元素的定位不會相互影響。

一定的 CSS 聲明可以生成 BFC,瀏覽器對生成的 BFC 有一系列的渲染規(guī)則,利用這些渲染規(guī)則可以達到一定的布局效果。

  • 為什么需要 BFC 呢?
  1. 它可以防止 margin 元素重疊(div 中包含 ul,而 div 與 ul 之間的垂直距離,取決于 div、ul、li 三者之間的最大外邊距,這時候給 ul 一個 display:inline-block 即可解決這個問題)
  2. 清除內(nèi)部浮動(div 中包含 ul,而 ul 采用 float:left,那么 div 將變成一長條,這時候給 div 加上規(guī)則使其變成 BFC 即可)
  • 如何產(chǎn)生 BFC?
  1. display: inline-block
  2. position: absolute/fixed
  • 工作中一般可能不會顧及這個:
  1. float 很少使用了,盡可能使用 flex
  2. css reset 一般會清除掉一些問題,減少 BFC 的使用。

參考文獻:《我對BFC的理解》

返回目錄

4.9 行內(nèi)元素和塊級元素

返回目錄

行內(nèi)元素:寬度和高度由內(nèi)容決定,與其他元素共占一行的元素,我們將其叫行內(nèi)元素。例如:<span>、<i>、<a> 等……

塊級元素:默認(rèn)寬度由父容器決定,默認(rèn)高度由內(nèi)容決定,獨占一行并且可以設(shè)置寬高的元素,我們將其叫做塊級元素。例如:<p><div>、<ul> 等……

在日常開發(fā)中,我們經(jīng)常使用 CSS 的 display 屬性來打破兩者的壁壘:display: inline-block,使它們擁有更多的狀態(tài)。

4.10 行內(nèi)樣式、內(nèi)嵌式、鏈接式以及導(dǎo)入式

返回目錄

在引用 CSS 上,分為四種形式:行內(nèi)樣式、內(nèi)嵌式、鏈接式以及導(dǎo)入式,下面介紹這四種模式。

  • 行內(nèi)樣式

直接對 HTML 的標(biāo)記使用 style 屬性,然后將 CSS 代碼直接寫進去:

<p style='color: #fff; backgournd: deepskyblue;'></p>復(fù)制代碼
  • 內(nèi)嵌式

將 CSS 寫 <head></head> 之間,并且用 <style></style> 標(biāo)記進行聲明:

<head>  <style>    p {      color: #fff;      background: deepskyblue;    }  </style></head>復(fù)制代碼
  • 鏈接式

通過將 <style> 上的 CSS 提起到指定的 CSS 文件上,然后通過 <link> 的方式在 HTML 上鏈接起來。

<head> <link href='reset.css' type='text/css' rel='stylesheet'></head>復(fù)制代碼
  • 導(dǎo)入樣式
<head>  <style>    @import url(reset.css);  </style></head>復(fù)制代碼
  • 各種方式的優(yōu)先級

在優(yōu)先級上,行內(nèi)樣式 > 鏈接式 > 內(nèi)嵌式 > @import 導(dǎo)入式

4.11 水平垂直居中

返回目錄

  • 什么是 Flex 布局?

Flex 是 Flexible Box 的縮寫,意為”彈性布局”,用來為盒狀模型提供最大的靈活性。

  • Flex 布局有哪些便利
/* 設(shè)置 Flex 模式 */display: flex;/* 決定元素是橫排還是豎著排,要不要倒序 */flex-direction: column;/* 決定元素換行格式,一行排不下的時候如何排 */flex-wrap: wrap;/* flex-flow = flex-direction + flex-wrap */flex-flow: column wrap;/* 同一排下對齊方式,空格如何隔開各個元素 */justify-content: space-between;/* 同一排下元素如何對齊,頂部對齊、中部對齊還是其他 */align-items: center;/* 多行對齊方式 */align-content: space-between;復(fù)制代碼
  • 如何通過 Flex 實現(xiàn)元素水平垂直居中?

HTML

<div class='container'>  <div class='child'></div></div>復(fù)制代碼

CSS

.container { margin: 0 auto; width: 300px; height: 200px; background: deepskyblue; display: flex; /* 實現(xiàn)元素水平居中 */ justify-content: center; /* 實現(xiàn)元素垂直居中 */ align-items: center;}.child { width: 100px; height: 100px; background: #fff;}復(fù)制代碼
  • 除了 Flex,還能使用其他形式進行水平垂直居中嗎?

HTML

<div class='container'>  <div class='child'></div></div>復(fù)制代碼

CSS

.container { position: relative; width: 300px; height: 200px; background: pink; margin: 0 auto;}.child { position: absolute; width: 100px; height: 100px; top: 50%; left: 50%; /* 下面兩種方式均可 */ /* margin-top: -50px; margin-left: -50px; */ transform: translate(-50%, -50%); background: #fff;}復(fù)制代碼
  • 除此之外再談?wù)?CSS 水平居中或者垂直居中?

水平居中:

  1. 行內(nèi)元素:display: inline-block; text-align: center;
  2. 塊級元素:margin: 0 auto;
  3. Flex:display: flex; justify-content: center;

垂直居中:

  1. 行高 = 元素高:line-height: height
  2. Flex:display: flex; align-items: center;

參考文獻:
《CSS實現(xiàn)垂直居中的常用方法》
《CSS 用 position: absolute 與 transform 來居中塊級元素的問題》

五 JavaScript

返回目錄

HTML 屬于結(jié)構(gòu)層,負責(zé)描繪出內(nèi)容的結(jié)構(gòu)。

CSS 屬于表示層,負責(zé)如何顯示有關(guān)內(nèi)容。

JavaScript 屬于行為層,負責(zé)內(nèi)容應(yīng)如何對事件做出反應(yīng)。

5.1 JS 學(xué)習(xí)推薦

返回目錄

  • 《JavaScript 高級程序(第三版)》
  • 《你不知道的 JavaScript》
  • 《JavaScript 忍者秘籍》
  • 《ES6 標(biāo)準(zhǔn)入門》—— 阮一峰
  • 《JavaScript 設(shè)計模式》—— 張容銘
  • 《JavaScript 設(shè)計模式與開發(fā)實踐》—— 曾探

5.2 JS 引用方式

返回目錄

  • 行內(nèi)引入
<body>  <input type='button' onclick='alert('行內(nèi)引入')' value='按鈕'/>  <button onclick='alert(123)'>點擊我</button></body>復(fù)制代碼
  • 內(nèi)部引入
<script> window.onload = function() { alert('js 內(nèi)部引入!'); }</script>復(fù)制代碼
  • 外部引入
<body>  <div></div>  <script type='text/javascript' src='./js/index.js'></script></body>復(fù)制代碼

注意

  1. 不推薦寫行內(nèi)或者在 HTML 中插入 <script>,因為瀏覽器解析順序緣故,如果解析到死循環(huán)之類的 JS 代碼,會卡住頁面。
  2. 建議在 onload 事件之后,即等 HTML、CSS 渲染完畢再執(zhí)行代碼。

5.3 原型與原型鏈

返回目錄

關(guān)于 prototype、__proto__、newcall()、apply()、bind()、this 這些的知識點,由于篇幅太長,jsliang 已經(jīng)抽離了出來,并做了簡潔詳細講解,詳見:

下面放出相關(guān)知識點:

  • 實例的 __proto__ 屬性(原型)等于其構(gòu)造函數(shù)的 prototype 屬性。
  • Object.proto === Function.prototype
  • Function.prototype.proto === Object.prototype
  • Object.prototype.proto === null

5.4 作用域與閉包

返回目錄

在 JS 中,最容易混淆的就是作用域的情況。

在傳統(tǒng)的后端語言(例如 C 語言)中,一對花括號 {} 就是一個塊級作用域,作用域內(nèi)變量不會相互影響,但是在 JS 中,像 if 條件語句的 {} 就不算一個獨立的作用域:

var x = 1;console.log(x); // 1if(true) { var x = 2; console.log(x); // 2}console.log(x); // 2復(fù)制代碼

所以有時候我們就需要變通,通過自執(zhí)行函數(shù)創(chuàng)建臨時作用域:

function foo() {  var x = 1;  console.log(x); // 1  if(x) {    (function(x) {      console.log(x); // 1      var x = 2;      console.log(x); // 2    })(x)  }  console.log(x); // 1}foo();復(fù)制代碼

說到創(chuàng)建臨時作用域,我們就不得不談一下閉包。

那么,什么是閉包呢?

閉包簡單定義:函數(shù) A 里面包含了 函數(shù) B,而 函數(shù) B 里面使用了 函數(shù) A 的變量,那么 函數(shù) B 被稱為閉包。

又或者:閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)

function A() { var a = 1; function B() { console.log(a); } return B();}復(fù)制代碼
  • 閉包經(jīng)典問題:現(xiàn)在我們有一段代碼:
for(var i = 0; i < 3; i++) {  setTimeout(function() {    console.log(i);  }, 1000);}復(fù)制代碼

請問這段代碼輸出什么?

答案:3 個 3。
解析:首先,for 循環(huán)是同步代碼,先執(zhí)行三遍 for,i 變成了 3;然后,再執(zhí)行異步代碼 setTimeout,這時候輸出的 i,只能是 3 個 3 了。

  • 那么,我們有什么辦法依次輸出 0 1 2 么?
  1. 使用 let:
for(let i = 0; i < 3; i++) { setTimeout(function() { console.log(i); }, 1000);}復(fù)制代碼

在這里,每個 let 和代碼塊結(jié)合起來形成塊級作用域,當(dāng) setTimeout() 打印時,會尋找最近的塊級作用域中的 i,所以依次打印出 0 1 2。

如果這樣講不明白,我們可以執(zhí)行下下面這段代碼:

for(let i = 0; i < 3; i++) {  console.log('定時器外部:' + i);  setTimeout(function() {    console.log(i);  }, 1000);}復(fù)制代碼

此時瀏覽器依次輸出的是:

定時器外部:0定時器外部:1定時器外部:2012復(fù)制代碼

即代碼還是先執(zhí)行 for 循環(huán),但是當(dāng) for 結(jié)束執(zhí)行到了 setTimeout 的時候,它會做個標(biāo)記,這樣到了 console.log(i) 中,i 就能找到這個塊中最近的變量定義。

  1. 使用立即執(zhí)行函數(shù)解決閉包問題
for(let i = 0; i < 3; i++) {  (function(i){    setTimeout(function() {      console.log(i);    }, 1000);  })(i)}復(fù)制代碼

以上,我們就講解完了閉包及解決閉包的方式。

觀點 1:有些資料表示閉包中產(chǎn)生的大量局部變量,會造成內(nèi)存消耗過大,從而造成網(wǎng)頁的性能問題。
觀點 2:有些資料表示目前瀏覽器引擎都基于 V8,而 V8 引擎有個 gc 回收機制,不用太過擔(dān)心變量不會被回收。
提示:所以,如果你覺得不夠保險,那就在退出函數(shù)之前,將不使用的局部變量全部刪除。

5.5 淺拷貝與深拷貝

返回目錄

  • 什么是深拷貝?什么是淺拷貝?

簡單來說,有兩個對象 A 和 B,B = A,當(dāng)你修改 A 時,B 的值也跟著發(fā)生了變化,這時候就叫淺拷貝。如果不發(fā)生變化,就叫深拷貝。

  • 為什么會出現(xiàn)深拷貝與淺拷貝?
  1. 首先我們需要知道基本數(shù)據(jù)類型(number、string、boolean、null、undefined)引用數(shù)據(jù)類型(無序?qū)ο?,?shù)據(jù)以及函數(shù))
  2. 然后在基本數(shù)據(jù)類型中,例如:let a = 1; let b = a; a = 2; console.log(b)。當(dāng)我們嘗試這樣子寫時,b 在棧內(nèi)存中開辟了一個新內(nèi)存,所以 b 的值不會改變,仍是 1.
  3. 接著在引用數(shù)據(jù)類型中,例如 let a = [1, 2, 3], b = a; a[0] = 3; console.log(b)。當(dāng)我們嘗試這樣子寫時,b 會偷懶,引用跟 a 同一塊的內(nèi)存地址,從而 a 的修改會影響 b,使得 b 變成 [3, 1, 3]。
  4. 最后,我們可以知道在引用數(shù)據(jù)類型中,會產(chǎn)生淺拷貝的問題。
  • 如何實現(xiàn)深拷貝?
  1. 首先我們嘗試使用遞歸去解決深拷貝:
function deepClone(obj) { let objClone = Array.isArray(obj) ? [] : {}; if(obj && typeof obj === 'object') { for(key in obj) { if(obj.hasOwnProperty(key)) { // 判斷 obj 子元素是否為對象,如果是,遞歸復(fù)制 if(obj[key] && typeof obj[key] === 'object') { objClone[key] = deepClone(obj[key]); } else { // 如果不是,簡單復(fù)制 objClone[key] = obj[key]; } } } } return objClone;}let a = [1, 2, 3, 4];let b = deepClone(a);a[0] = 2;console.log(a, b);// Console// a = [2, 2, 3, 4];// b = [1, 2, 3, 4];復(fù)制代碼
  1. 使用 JSON 對象的 parse 和 stringify

注意:采用 JSON 進行的深拷貝,無法拷貝到 undefined、function、symbol 這類數(shù)據(jù),它是有小 bug 的深拷貝。

function deepClone(obj) { let _obj = JSON.stringify(obj); let objClone = JSON.parse(_obj); return objClone}let a = [0, 1, [2, 3], 4];let b = deepClone(a);a[0] = 1;a[2][0] = 1;console.log(a, b);// Console// a = [1, 1, [1, 3], 4];// b = [0, 1, [2, 3], 4];復(fù)制代碼

5.6 模塊化與組件化

返回目錄

在前端發(fā)展中,隨著前后端分離,前端社區(qū)的不斷壯大,前端能做的事情越來越多,承受的任務(wù)越來越重,代碼也就越來越長了。就好比 jsliang 個人使用 jQuery 開發(fā)的時候,動不動就上千行代碼,這在一個編輯器上看起來就有點亂了。如果碰上沒有代碼折疊的編輯器,你就更加難受了。

有的小伙伴的編輯器不是 VS Code,也不能進行代碼折疊

所以,面對越來越多的代碼,我們就急需將這些代碼分門別類,將代碼按功能劃分,將同一功能的代碼整合在一起,于是就有了模塊化開發(fā):一個文件就是一個模塊,當(dāng)我們需要某個文件的時候,我們只需要引用這個模塊即可……

首先,是 CommonJS 的提出,在 Node.js 以及 Webpack 都支持 CommonJS,它規(guī)定了一個文件就是一個模塊,文件內(nèi)部定義的變量屬于這個模塊,不會對外暴露從而污染全局變量的規(guī)則。在 CommonJS 中,通過 exports 或者 module.exports 進行導(dǎo)出,通過 require 進行 同步加載 所需要依賴的模塊。由于它是同步加載模塊的形式,所以比較通用于服務(wù)器端。

然后,根據(jù) CommonJS 只能同步加載的問題,AMD 根據(jù)瀏覽器的特性,進行了非同步加載模塊的提出。同時,AMD 有個問題,就是在使用 require.js 的時候,必須提前加載所有模塊。

接著,根據(jù) AMD 的問題,CMD 提出來了:通過按需加載的形式,哪里需要就調(diào)用哪里,而不用等到所有的模塊都加載了再解析。

最后,ECMA 國際推出了 ES6 的 modules。在 ES6 中,通過 export 關(guān)鍵字導(dǎo)出模塊,通過 import 關(guān)鍵字引用代碼。當(dāng)然,由于瀏覽器廠商諸多,ES6 在瀏覽器的尚不支持,目前主流做法是先將 ES6 通過 babel 編譯成 require。

當(dāng)然,JS 都進行模塊化了,jsliang 想起自己項目中的那一坨 CSS,真心沒有回顧的想法!所以我們還需要知道為了方便管理 CSS,大佬們還是有做事兒的:Less 以及 Sass,這兩者使 CSS 的編寫更有組織性和目的性了。

說起模塊化,我們又可以順帶提及組件化了,一開始為了區(qū)分這兩者,jsliang 也是百度了大量文章,最后成功把自己整蒙了,還是說說感覺可以的解釋:

組件化更關(guān)注的是 UI 部分:彈出框、頭部,內(nèi)容區(qū)、按鈕等,都可以編寫成組件,然后在適用的地方進行引用。而模塊化更側(cè)重于功能或者數(shù)據(jù)的封裝,比如全局的 JSON 配置文件,比如通用的驗證方法,比如規(guī)范時間戳等。

所以,說到這里,我們就可以提到前端工程化:將整個開發(fā)流程就行工程規(guī)劃,從而提高整個團隊的開發(fā)效率。

在前端工程化中,最重要的就是提高整個團隊在 編碼 -> 測試 -> 維護 這三個階段的生產(chǎn)效率。團隊的協(xié)調(diào)至關(guān)重要,將每個任務(wù)細分給各個成員,從而獲取極致的工作效率,是管理者最喜歡看到的。而在上面的模塊化和組件化的應(yīng)用,就屬于前端工程化中的一部分,其目的就是在一些復(fù)雜的項目中,方便團隊進行合作開發(fā),提高生產(chǎn)效率。

參考文獻:
《到底什么是前端工程化、模塊化、組件化》
《【前端工程化系列】簡談前端模塊化開發(fā)與開發(fā)規(guī)范》
《個人關(guān)于模塊化的理解》
《組件化開發(fā)和模塊化開發(fā)概念辨析》
《JavaScript模塊化 --- Commonjs、AMD、CMD、es6 modules》
《淺談什么是前端工程化》

5.7 面向?qū)ο笈c面向過程

返回目錄

  1. 什么是面向過程與面向?qū)ο螅?/li>
  • 面向過程就是做圍墻的時候,由你本身操作,疊第一層的時候:放磚頭,糊水泥,放磚頭,糊水泥;然后第二層的時候,繼續(xù)放磚頭,糊水泥,放磚頭,糊水泥……
  • 面向?qū)ο缶褪亲鰢鷫Φ臅r候,由他人幫你完成,將做第一層的做法抽取出來,就是放磚頭是第一個動作,糊水泥是第二個動作,然后給這兩個動作加上步數(shù),最后告訴機器人有 n 層,交給機器人幫你工作就行了。
  1. 為什么需要面向?qū)ο髮懛ǎ?/li>
  • 更方便
  • 可以復(fù)用,減少代碼冗余度
  • 高內(nèi)聚低耦合

簡單來說,就是增加代碼的可復(fù)用性,減少咱們的工作,使代碼更加流暢。

  1. 手寫個面向?qū)ο蟠a?
function Person(name, phone) { this.name = name; this.phone = phone; this.eat = function() { console.log(name + ' 吃飯'); } return this;}let p1 = new Person('jsliang', '18818881888');console.log(p1.name); // jsliangp1.eat(); // jsliang 吃飯復(fù)制代碼

當(dāng)然,jsliang 只能寫到這里了,再寫下去就是設(shè)計模式等知識點了。

所以希望小伙伴們還是了解下面向?qū)ο笏枷?,有助于進一步提升自己。

5.8 防抖與節(jié)流

返回目錄

關(guān)于 防抖與節(jié)流jsliang 特意將資料結(jié)合起來:

  • 防抖與節(jié)流
  • 重繪與回流
  • 瀏覽器解析 URL
  • DNS 域名解析
  • TCP 三次握手與四次揮手
  • 瀏覽器渲染頁面

小伙伴們可以前往 《面試知識點 - JS 防抖與節(jié)流》 查看。

5.9 ES6

返回目錄

ES6 是個大知識點,如果你面試的公司不是 “飽經(jīng)滄桑” 的那種,那么一定會出點 ES6 問題,例如:

  • 說說 let、var、const 區(qū)別
  • 講講 Promise 及其使用

因為 jsliang 感覺自己連 ES6 的門還沒進,所以在這里就不 自作聰明,推薦下阮一峰大佬的教程:

希望小伙伴們看完能有所收獲,并在工作中大量使用。

5.10 數(shù)組操作

返回目錄

在 JavaScript 中,用得較多的之一無疑是數(shù)組操作,這里過一遍數(shù)組的一些用法:

  • map: 遍歷數(shù)組,返回回調(diào)返回值組成的新數(shù)組
  • forEach: 無法break,可以用try/catch中throw new Error來停止
  • filter: 過濾
  • some: 有一項返回true,則整體為true
  • every: 有一項返回false,則整體為false
  • join: 通過指定連接符生成字符串
  • push / pop: 末尾推入和彈出,改變原數(shù)組, 返回推入/彈出項【有誤】
  • unshift / shift: 頭部推入和彈出,改變原數(shù)組,返回操作項【有誤】
  • sort(fn) / reverse: 排序與反轉(zhuǎn),改變原數(shù)組
  • concat: 連接數(shù)組,不影響原數(shù)組, 淺拷貝
  • slice(start, end): 返回截斷后的新數(shù)組,不改變原數(shù)組
  • splice(start, number, value...): 返回刪除元素組成的數(shù)組,value 為插入項,改變原數(shù)組
  • indexOf / lastIndexOf(value, fromIndex): 查找數(shù)組項,返回對應(yīng)的下標(biāo)
  • reduce / reduceRight(fn(prev, cur), defaultPrev): 兩兩執(zhí)行,prev 為上次化簡函數(shù)的return值,cur 為當(dāng)前值(從第二項開始)

相信小伙伴在工作中耍的已經(jīng)是一套一套的了,或者像 jsliang 一樣只會簡單的使用 pushmap 這幾個,感興趣的小伙伴可以 百度/bing/google 找找一些 奇技淫巧,說不定對工作效率有很大提升~

六 Vue

返回目錄

推薦:

  1. 技術(shù)胖
  2. 慕課網(wǎng)

6.1 MVVM

返回目錄

在 MVVM 架構(gòu)下,View 和 Model 之間并沒有直接的聯(lián)系,而是通過 ViewModel 進行交互,Model 和 ViewModel 之間的交互時雙向的,因此 View 數(shù)據(jù)會同步到 Model 中,而 Model 數(shù)據(jù)的變化也會立即反應(yīng)到 View 上。

ViewModel 通過雙向數(shù)據(jù)綁定把 View 層和 Model 層連接了起來,而 View 和 Model 之間的同步工作完全是自動的,無需人為干涉,因此開發(fā)者只需要關(guān)注業(yè)務(wù)邏輯,不需要手動操作 DOM,不需要關(guān)注數(shù)據(jù)狀態(tài)的同步問題,復(fù)雜的數(shù)據(jù)狀態(tài)維護完全由 MVVM 來統(tǒng)一管理。

  1. M - Model。Model 代表數(shù)據(jù)模型,也可以在 Model 中定義數(shù)據(jù)修改和操作的業(yè)務(wù)邏輯。
  2. V - View。View 代表 UI 組件,它負責(zé)將數(shù)據(jù)模型轉(zhuǎn)化為 UI 展現(xiàn)出來。
  3. VM - ViewModel。ViewModel 監(jiān)聽模型數(shù)據(jù)的改變和控制視圖行為、處理用戶交互,簡單理解就是一個同步 View 和 Model 的對象,連接 Model 和 View。

6.2 生命周期

返回目錄

  • 請大致講下 Vue 的生命周期?
  1. 創(chuàng)建前/后:在 beforeCreated 階段,Vue 實例的掛載元素 $el 和數(shù)據(jù)對象 data 以及事件還未初始化。在 created 階段,Vue 實例的數(shù)據(jù)對象 data 以及方法的運算有了,$el 還沒有。
  2. 載入前/后:在 beforeMount 階段,render 函數(shù)首次被調(diào)用,Vue 實例的 $el 和 data 都初始化了,但還是掛載在虛擬的 DOM 節(jié)點上。在 mounted 階段,Vue 實例掛載到實際的 DOM 操作完成,一般在該過程進行 Ajax 交互。
  3. 更新前/后:在數(shù)據(jù)更新之前調(diào)用,即發(fā)生在虛擬 DOM 重新渲染和打補丁之前,調(diào)用 beforeUpdate。在虛擬 DOM 重新渲染和打補丁之后,會觸發(fā) updated 方法。
  4. 銷毀前/后:在執(zhí)行實例銷毀之前調(diào)用 beforeDestory,此時實例仍然可以調(diào)用。在執(zhí)行 destroy 方法后,對 data 的改變不會再觸發(fā)周期函數(shù),說明此時 Vue 實例已經(jīng)解除了事件監(jiān)聽以及和 DOM 的綁定,但是 DOM 結(jié)構(gòu)依然存在。
  • 什么是 Vue 生命周期?

Vue 實例從創(chuàng)建到銷毀的過程,就是生命周期。從開始創(chuàng)建、初始化數(shù)據(jù)、編譯模板、掛載 DOM -> 渲染、更新 -> 渲染、銷毀等一系列過程,稱之為 Vue 的生命周期。

  • Vue 有幾個生命周期,它們的作用主要是什么?

8 個,創(chuàng)建前/創(chuàng)建后、掛載前/掛載后、更新前/更新后、銷毀前/銷毀后。Vue 生命周期的作用是方便我們通過它的生命周期,在業(yè)務(wù)代碼中更好地操作數(shù)據(jù),實現(xiàn)相關(guān)功能。

  • 第一次頁面加載會觸發(fā) Vue 哪幾個鉤子?

會觸發(fā) 4 個生命鉤子:創(chuàng)建前/創(chuàng)建后、掛載前/掛載后

  • DOM 渲染在哪個周期就已經(jīng)完成?

beforeMounted 時它執(zhí)行了 render 函數(shù),對 $el 和 data 進行了初始化,但此時還是掛載到虛擬的 DOM 節(jié)點,然后它在 mounted 時就完成了 DOM 渲染,這時候我們一般還進行 Ajax 交互。

6.3 雙向數(shù)據(jù)綁定

返回目錄

Vue 采用 數(shù)據(jù)劫持 結(jié)合 發(fā)布者-訂閱者 模式的方式,通過 Object.defineProperty() 來劫持各個屬性的 setter 以及 getter,在數(shù)據(jù)變動時發(fā)布消息給訂閱者,觸發(fā)相應(yīng)的監(jiān)聽回調(diào)。

  1. 第一步:需要 Observe 的數(shù)據(jù)對象進行遞歸遍歷,包括子屬性對象的屬性,都加上 setter 和 getter。這樣的話,給這個對象的某個值賦值,就會觸發(fā) setter,那么就能監(jiān)聽到了數(shù)據(jù)變化。
  2. 第二步:Compile 解析模板指令,將模板中的變量替換成數(shù)據(jù),然后初始化渲染頁面視圖,并將每個指令對應(yīng)的節(jié)點綁定更新函數(shù),添加監(jiān)聽數(shù)據(jù)的訂閱者,一旦數(shù)據(jù)有變動,收到通知,更新數(shù)據(jù)。
  3. 第三步:Watcher 訂閱者是 Observer 和 Compile 之間通信的橋梁,主要做的事情有:
    1. 在自身實例化時往屬性訂閱器(dep)里面添加自己。
    2. 自身必須有一個 update() 方法
    3. 待屬性變動 dep.notice() 通知時,能調(diào)用自身的 update() 方法,并觸發(fā) Compile 中綁定的回調(diào),則功成身退。
  4. 第四步:MVVM 作為數(shù)據(jù)綁定的入口,整合 Observer、Compile 和 Watcher 三者,通過 Observer 來監(jiān)聽自己的 model 數(shù)據(jù)變化,通過 Compile 來解析編譯模板指令,最終利用 Watcher 搭起 Observer 和 Compile 之間的橋梁,達到數(shù)據(jù)變化 -> 視圖更新;視圖交互變化(input) -> 數(shù)據(jù) model 變更的雙向綁定效果。

js 實現(xiàn)簡單的雙向綁定

<body>  <div id='app'>    <input type='text' id='txt'>    <p id='show'></p>  </div>    <script>    window.onload = function() {      let obj = {};      Object.defineProperty(obj, 'txt', {        get: function() {          return obj;        },        set: function(newValue) {          document.getElementById('txt').value = newValue;          document.getElementById('show').innerHTML  = newValue;        }      })      document.addEventListener('keyup', function(e) {        obj.txt = e.target.value;      })    }  </script></body>復(fù)制代碼

Object.defineProperty 接收三個參數(shù):對象,屬性名,配置對象
這里使用的是 Object.defineProperty,這是 Vue 2.0 進行雙向數(shù)據(jù)綁定的寫法。在 Vue 3.0 中,它使用 Proxy 進行數(shù)據(jù)劫持。

  • 為什么 Vue 3.0 中使用 Proxy 了?
  1. Vue 中使用 Object.defineProperty 進行雙向數(shù)據(jù)綁定時,告知使用者是可以監(jiān)聽數(shù)組的,但是只是監(jiān)聽了數(shù)組的 push()、pop()、shift()、unshift()、splice()、sort()、reverse() 這八種方法,其他數(shù)組的屬性檢測不到。
  2. Object.defineProperty 只能劫持對象的屬性,因此對每個對象的屬性進行遍歷時,如果屬性值也是對象需要深度遍歷,那么就比較麻煩了,所以在比較 Proxy 能完整劫持對象的對比下,選擇 Proxy。
  3. 為什么 Proxy 在 Vue 2.0 編寫的時候出來了,尤大卻沒有用上去?因為當(dāng)時 es6 環(huán)境不夠成熟,兼容性不好,尤其是這個屬性無法用 polyfill 來兼容。(polyfill 是一個 js 庫,專門用來處理 js 的兼容性問題-js 修補器)

參考自《實現(xiàn)雙向綁定Proxy比defineproperty優(yōu)劣如何》

6.4 Virtual DOM

返回目錄

Vue 在 rendercreateElement 的時候,并不是產(chǎn)生真實的 DOM 元素,實際上 createElement 描述為 createNodeDescription,因為它所包含的信息會告訴 Vue 頁面上需要渲染什么樣的節(jié)點。

因此,我們將這樣的節(jié)點描述為 “虛擬節(jié)點”(Virtual Node),簡稱 VNode?!疤摂M DOM” 是我們對由 Vue 組件樹建立的整個 VNode 樹的稱呼。

作為一枚切圖仔,很榮幸地跟小伙伴說:“其實我也不懂 Virtual DOM!”

但是,總會有些面試場合會提到的,所以這里找了幾篇資料,小伙伴們可以進一步學(xué)習(xí):

其他的就需要小伙伴自己尋找了,如果覺得有不錯的解析 Virtual DOM 的文檔/視頻,小伙伴也可以推薦過來哈~

6.5 template 編譯

返回目錄

  • Vue template 編譯的理解

Vue 中 template 就是先轉(zhuǎn)化成 AST 樹,再得到 render 函數(shù)返回 VNode(Vue 的虛擬 DOM 節(jié)點)。

  1. 通過 compile 編譯器把 template 編譯成 AST 語法樹(abstract syntax tree - 源代碼的抽象語法結(jié)構(gòu)的樹狀表現(xiàn)形式),compile 是 createCompiler 的返回值,createCompiler 是用以創(chuàng)建編譯器的。另外 compile 還負責(zé)合并 option。
  2. AST 會經(jīng)過 generate(將 AST 語法樹轉(zhuǎn)換成 render function 字符串的過程)得到 render 函數(shù),render 的返回值是 VNode,VNode 是 Vue 的虛擬 DOM 節(jié)點,里面有標(biāo)簽名、子節(jié)點、文本等待。

6.6 key

返回目錄

key 的作用就是在更新組件時判斷兩個節(jié)點是否相同。相同就復(fù)用,不相同就刪除舊的創(chuàng)建新的。

對于 diff 過程來說 key 是起不到提速作用的,詳見:key 的作用

6.7 nextTick

返回目錄

  • 用法:Vue.nextTick( [callback, context] )

  • 參數(shù):

    • {Function} [callback]
    • {Object} [context]
  • 說明:在下次 DOM 更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào)。在修改數(shù)據(jù)之后立即使用這個方法,獲取更新后的 DOM。

  • 案例:

// 修改數(shù)據(jù)vm.msg = 'Hello'// DOM 還沒有更新Vue.nextTick(function () { // DOM 更新了})// 作為一個 Promise 使用 (2.1.0 起新增,詳見接下來的提示)Vue.nextTick().then(function () { // DOM 更新了})復(fù)制代碼

關(guān)于 nextTick 的更多理解,jsliang 就不獻丑了,需要學(xué)習(xí)的小伙伴可以查看:

或者自行查找更優(yōu)秀的資源。

6.8 父子組件通訊

返回目錄

關(guān)于 Vue 中的父子組件通訊,相信經(jīng)常開發(fā) Vue 的小伙伴比 jsliang 知道的多很多。

沒怎么使用 Vue 的小伙伴可以看下下面的文章,并嘗試自己寫一寫:

下面咱講下使用 bus.js 實現(xiàn)非父子組件通訊:

假設(shè)在工作中,有三個 .vue 文件:A.vue、B.vue、C.vue。A.vue 是主頁面,B.vue 和 C.vue 類似于頭部導(dǎo)航條和底部導(dǎo)航欄?,F(xiàn)在,B.vue 點擊會切換路由,C.vue 需要獲取 B.vue 傳遞的信息。

A.vue

<template>  <div>    <top-nav></top-nav>    <div class='container'>      <router-view></router-view>    </div>    <bottom-nav></bottom-nav>  </div></template>復(fù)制代碼

bus.js

import Vue from 'vue';// 使用 Event Busconst bus = new Vue();export default bus;復(fù)制代碼

B.vue

<template>  <div class='bottom-nav'>    <div class='nav-one' @click='goToPage({path: '/HomeIndex', meta:'首頁'})'>      <i class='icon-home'></i>      <span>首頁</span>    </div>  </div></template><script>  import bus from '../utils/bus'  export default {    methods: {      goToPage(route) {        this.$router.push(route.path);        bus.$emit('meta', route.meta);      }    }  }</script>復(fù)制代碼

C.vue

<template> <div class='top-nav'> <span class='title'>{{title}}</span> </div></template><script> import bus from '../utils/bus' export default { data() { return { title: '' } }, created() { bus.$on('meta', msg=> { this.title = msg; }) } }</script>復(fù)制代碼

七 微信小程序

返回目錄

微信小程序,簡稱小程序,英文名 Mini Program,是一種不需要下載安裝即可使用的應(yīng)用,它實現(xiàn)了應(yīng)用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應(yīng)用。

7.1 文件主要目錄及文件作用

返回目錄

- component —————————————————— 組件文件夾  - navBar                  —— 底部組件    - navBar.js             —— 底部組件的 JS 代碼    - navBar.json           —— 底部組件的配置文件    - navBar.wxml           —— 底部組件的 HTML 代碼    - navBar.wxss           —— 底部組件的 CSS 代碼- pages  ————————————————————— 頁面文件夾  - index                   —— 首頁    - index.js              —— 首頁的 JS 代碼    - index.json            —— 首頁的配置文件    - index.wxml            —— 首頁的 HTML 代碼    - index.wxss            —— 首頁的 CSS 代碼- public ————————————————————— 圖片文件夾- utils —————————————————————— 工具文件夾  - api.js                  —— 控制 API 的文件  - md5.js                  —— 工具 - MD5 加密文件  - timestamp.js            —— 工具 - 時間戳文件- app.json ——————————————————— 設(shè)置全局的基礎(chǔ)數(shù)據(jù)等- app.wxss ——————————————————— 公共樣式,可通過 import 導(dǎo)入更多- project.config.json ———————— 項目配置文件復(fù)制代碼

7.2 微信小程序生命周期

返回目錄

  • onLoad():頁面加載時觸發(fā)。
  • onShow():頁面顯示/切入前臺時觸發(fā)。
  • onReady():頁面初次渲染完成時觸發(fā)。
  • onHide():頁面隱藏/切入后臺時觸發(fā)。
  • onUnload():頁面卸載時觸發(fā)。

7.3 如何封裝數(shù)據(jù)請求

返回目錄

  1. 封裝接口:

項目/utils/api.js

// 將請求進行 Promise 封裝const fetch = ({url, data}) => { // 打印接口請求的信息 console.log(`【step 1】API 接口:${url}`); console.log('【step 2】data 傳參:'); console.log(data); // 返回 Promise return new Promise((resolve, reject) => { wx.request({ url: getApp().globalData.api + url, data: data, success: res => { // 成功時的處理 if (res.data.code == 0) { console.log('【step 3】請求成功:'); console.log(res.data); return resolve(res.data); } else { wx.showModal({ title: '請求失敗', content: res.data.message, showCancel: false }); } }, fail: err => { // 失敗時的處理 console.log(err); return reject(err); } }) })}/** * code 換取 openId * @data { * jsCode - wx.login() 返回的 code * } */export const wxLogin = data => { return fetch({ url: 'tbcUser/getWechatOpenId', data: data })}復(fù)制代碼
  1. 調(diào)用接口:

項目/pages/login/login.js

import {  wxLogin,} from '../../utils/api.js'復(fù)制代碼
  1. 使用接口:

項目/pages/login/login.js

wxLogin({ jsCode: this.data.code}).then( res => { console.log('【step 4】返回成功處理:'); console.log(res.data); }, err => { console.log('【step 4】返回失敗處理:'); console.log(err); })復(fù)制代碼

7.4 頁面數(shù)據(jù)傳遞

返回目錄

  1. 通過 url 攜帶參數(shù),在 onLoad() 中通過 options 獲取 url 上的參數(shù):

代碼演示

<navigator url='../index/index?userId={{userId}}'></navigator><!-- 這兩段是分別在 HTML 和 JS 中的代碼 -->onLoad: function(options) {  console.log(options.userId);}復(fù)制代碼
  1. 通過 Storage 來傳遞參數(shù):
wx.setStorageSync('userId', 'jsliang');wx.getStorageSync('userId');復(fù)制代碼
  1. WXML 傳遞數(shù)據(jù)到 JS

login.wxml

<text bindtap='clickText' data-labelId='{{userId}}'>點擊傳遞數(shù)據(jù)到 JS</text>復(fù)制代碼

login.js

clickText(e) { console.log(e.currentTarget.labelid)}復(fù)制代碼
  1. 組件調(diào)用傳參

組件接收數(shù)據(jù):component-tag-name

Component({  properties: {    // 這里定義了innerText屬性,屬性值可以在組件使用時指定    innerText: {      type: String,      value: 'default value',    }  }})復(fù)制代碼

使用組件的頁面定義 json

{ 'usingComponents': { 'component-tag-name': '../component/component' }}復(fù)制代碼

使用組件的頁面 HTML 代碼

<view>  <!-- 以下是對一個自定義組件的引用 -->  <component-tag-name inner-text='Some text'></component-tag-name></view>復(fù)制代碼
  1. 通過接口調(diào)用傳遞參數(shù)

7.5 加載性能優(yōu)化的方法

返回目錄

  1. 通過 this.$preload() 預(yù)加載用戶可能點擊的第二個頁面。
  2. 組件化頁面,出現(xiàn)兩次以上的部分都進行封裝成組件。
  3. 提取共用的 CSS 樣式。
  4. 優(yōu)化圖片:TinyPNG

7.6 微信小程序與原生 APP、Vue、H5 差異

返回目錄

  • 微信小程序優(yōu)劣勢:

優(yōu)勢

  1. 無需下載
  2. 打開速度較快
  3. 開發(fā)成本低于原生 APP

劣勢

  1. 限制多。頁面大小不能超過 1M,不能打開超過 5 個層級的頁面。
  2. 樣式單一。小程序內(nèi)部組件已經(jīng)成宿,樣式不可以修改。
  3. 推廣面窄。跑不出微信,還不能跑入朋友圈。
  • 微信小程序 VS 原生 APP

微信小程序有著低開發(fā)成本、低獲客成本、無需下載的優(yōu)勢。

  • 微信小程序 VS H5
  1. 依賴環(huán)境不同。一個能在多種手機瀏覽器運行。一個只能在微信中的非完整的瀏覽器。
  2. 開發(fā)成本不同。一個可能在各種瀏覽器出問題。一個只能在微信中運行。
  • 微信小程序 VS Vue

微信小程序看似就是閹割版的 Vue。

7.7 微信小程序原理

返回目錄

  1. 本質(zhì)上就是一個單頁面應(yīng)用,所有的頁面渲染和事件處理,都在一個頁面中進行。
  2. 架構(gòu)為數(shù)據(jù)驅(qū)動的模式,UI 和數(shù)據(jù)分離,所有頁面的更新,都需要通過對數(shù)據(jù)的更改來實現(xiàn)。
  3. 微信小程序分為兩個部分:webview 和 appService。其中 webview 主要用來展示 UI,appServer 用來處理業(yè)務(wù)邏輯、數(shù)據(jù)及接口調(diào)用。它們在兩個進程中進行,通過系統(tǒng)層 JSBridge 實現(xiàn)通信,實現(xiàn) UI 的渲染、事件的處理。

八 瀏覽器

返回目錄

8.1 瀏覽器解析 URL

返回目錄

關(guān)于 瀏覽器解析 URL,jsliang 特意將資料結(jié)合起來:

  • 防抖與節(jié)流
  • 重繪與回流
  • 瀏覽器解析 URL
  • DNS 域名解析
  • TCP 三次握手與四次揮手
  • 瀏覽器渲染頁面

小伙伴們可以前往 《面試知識點 - JS 防抖與節(jié)流》 查看。

8.2 重繪與回流

返回目錄

關(guān)于 重繪與回流,jsliang 特意將資料結(jié)合起來:

  • 防抖與節(jié)流
  • 重繪與回流
  • 瀏覽器解析 URL
  • DNS 域名解析
  • TCP 三次握手與四次揮手
  • 瀏覽器渲染頁面

小伙伴們可以前往 《面試知識點 - JS 防抖與節(jié)流》 查看。

8.3 數(shù)據(jù)存儲

返回目錄

  1. 存儲于代碼中,代碼執(zhí)行完畢釋放內(nèi)存。
  2. 存儲于瀏覽器中,cookie 用于短期存儲用戶身份,登錄狀態(tài)等較小的信息;localStorage/sessionStorage 用于長期存儲數(shù)據(jù),瀏覽器關(guān)閉不影響它們的內(nèi)存,相比于 cookie,storage 能存儲較多;IndexedDB 是瀏覽器提供的接近于 NoSQL 的數(shù)據(jù)庫,允許存儲大量數(shù)據(jù)。
  3. 存儲于數(shù)據(jù)庫中。

8.4 內(nèi)存管理與垃圾回收

返回目錄

V8 將內(nèi)存分為兩類:新生代內(nèi)存空間和老生代內(nèi)存空間。

  • 新生代內(nèi)存空間:主要用來存放存活時間較短的對象。
  • 老生代內(nèi)存空間:主要用來存放存活時間較長的對象。

這兩者通過不同的算法,對內(nèi)存進行管理操作。

8.5 內(nèi)存泄漏

返回目錄

  • 意外的全局變量:無法被回收。

  • 定時器:未被正確關(guān)閉,導(dǎo)致所引用的外部變量無法被釋放。

  • 事件監(jiān)聽:沒有正確銷毀(低版本瀏覽器可能出現(xiàn))。

  • 閉包:會導(dǎo)致父級中的變量無法被釋放。

  • DOM 引用:DOM 被刪除時,內(nèi)存中的引用未被正確清空。

  • 如何查看內(nèi)存變化情況?

使用 Chrome 的 Timeline(新版本 Performance)進行內(nèi)存標(biāo)記,可視化查看內(nèi)存的變化情況,找出異常點。

九 網(wǎng)絡(luò)協(xié)議

返回目錄

9.1 網(wǎng)絡(luò)分層

返回目錄

目前網(wǎng)絡(luò)分層可分為兩種:OSI 模型和 TCP/IP 模型。

  • OSI 模型
  1. 應(yīng)用層(Application)
  2. 表示層(Presentation)
  3. 會話層(Session)
  4. 傳輸層(Transport)
  5. 網(wǎng)絡(luò)層(Network)
  6. 數(shù)據(jù)鏈路層(Data Link)
  7. 物理層(Physical)
  • TCP/IP 模型
  1. 應(yīng)用層(Application)
  2. 傳輸層(Host-to-Host Transport)
  3. 互聯(lián)網(wǎng)層(Internet)
  4. 網(wǎng)絡(luò)接口層(Network Interface)

更多詳情可以查看下面這篇文章,里面講得非常詳細:

9.2 HTTP/HTTPS

返回目錄

  • HTTP:超文本傳輸協(xié)議(HTTP)是用于分布式,協(xié)作式和超媒體信息系統(tǒng)的應(yīng)用協(xié)議。它是Web上數(shù)據(jù)交換的基礎(chǔ),是一種 client-server 協(xié)議,也就是說請求通常是由像瀏覽器這樣的接受方發(fā)起的。
  • HTTPS:HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer),是以安全為目標(biāo)的 HTTP 通道,簡單講是 HTTP 的安全版。即 HTTP 下加入 SSL 層,HTTPS 的安全基礎(chǔ)是 SSL,因此加密的詳細內(nèi)容就需要 SSL。 它是一個 URI scheme(抽象標(biāo)識符體系),句法類同 http: 體系。用于安全的HTTP數(shù)據(jù)傳輸。https:URL 表明它使用了 HTTP,但 HTTPS 存在不同于 HTTP 的默認(rèn)端口及一個加密/身份驗證層(在 HTTP 與 TCP 之間)。這個系統(tǒng)的最初研發(fā)由網(wǎng)景公司進行,提供了身份驗證與加密通訊方法,現(xiàn)在它被廣泛用于萬維網(wǎng)上安全敏感的通訊,例如交易支付方面。

9.3 HTTP 狀態(tài)碼

返回目錄

首先,我們大致區(qū)分下狀態(tài)碼:

  1. 1**開頭 - 信息提示
  2. 2**開頭 - 請求成功
  3. 3**開頭 - 請求被重定向
  4. 4**開頭 - 請求錯誤
  5. 5**開頭 - 服務(wù)器錯誤

然后,常見的狀態(tài)碼:

  1. 200 - 請求成功,Ajax 接受到信息了。
  2. 400 - 服務(wù)器不理解請求,工作中常見于跨域的時候后端給我報 400!
  3. 403 - 服務(wù)器拒絕請求。
  4. 404 - 請求頁面錯誤。
  5. 500 - 服務(wù)器內(nèi)部錯誤,無法完成請求。

最后,小伙伴們?nèi)绻胍私飧啵€是需要自行查找資料的。

9.4 TCP 三次握手與四次揮手

返回目錄

關(guān)于 TCP 三次握手與四次揮手jsliang 特意將資料結(jié)合起來:

  • 防抖與節(jié)流
  • 重繪與回流
  • 瀏覽器解析 URL
  • DNS 域名解析
  • TCP 三次握手與四次揮手
  • 瀏覽器渲染頁面

小伙伴們可以前往 《面試知識點 - JS 防抖與節(jié)流》 查看。

十 性能優(yōu)化

返回目錄

通過優(yōu)化從而提高頁面的加載速度。

10.1 HTML 優(yōu)化

返回目錄

  1. 避免 HTML 中書寫 CSS 代碼,因為這樣難以維護。
  2. 使用 Viewport 加速頁面的渲染。
  3. 使用語義化標(biāo)簽,減少 CSS 代碼,增加可讀性和 SEO。
  4. 減少標(biāo)簽的使用,DOM 解析是一個大量遍歷的過程,減少不必要的標(biāo)簽,能降低遍歷的次數(shù)。
  5. 避免 src、href 等的值為空,因為即時它們?yōu)榭?,瀏覽器也會發(fā)起 HTTP 請求。
  6. 減少 DNS 查詢的次數(shù)。

10.2 CSS 優(yōu)化

返回目錄

  1. 優(yōu)化選擇器路徑:使用 .c {} 而不是 .a .b .c {}
  2. 選擇器合并:共同的屬性內(nèi)容提起出來,壓縮空間和資源開銷。
  3. 精準(zhǔn)樣式:使用 padding-left: 10px 而不是 padding: 0 0 0 10px。
  4. 雪碧圖:將小的圖標(biāo)合并到一張圖中,這樣所有的圖片只需要請求一次。
  5. 避免通配符:.a .b * {} 這樣的選擇器,根據(jù)從右到左的解析順序在解析過程中遇到通配符 * {} 會遍歷整個 DOM,性能大大損耗。
  6. 少用 float:float 在渲染時計算量比較大,可以使用 flex 布局。
  7. 為 0 值去單位:增加兼容性。
  8. 壓縮文件大小,減少資源下載負擔(dān)。

10.3 JavaScript 優(yōu)化

返回目錄

  1. 盡可能把 <script> 標(biāo)簽放在 body 之后,避免 JS 的執(zhí)行卡住 DOM 的渲染,最大程度保證頁面盡快地展示出來。
  2. 盡可能合并 JS 代碼:提取公共方法,進行面向?qū)ο笤O(shè)計等……
  3. CSS 能做的事情,盡量不用 JS 來做,畢竟 JS 的解析執(zhí)行比較粗暴,而 CSS 效率更高。
  4. 盡可能逐條操作 DOM,并預(yù)定好 CSs 樣式,從而減少 reflow 或者 repaint 的次數(shù)。
  5. 盡可能少地創(chuàng)建 DOM,而是在 HTML 和 CSS 中使用 display: none 來隱藏,按需顯示。
  6. 壓縮文件大小,減少資源下載負擔(dān)。

十一 算法

返回目錄

在算法這塊,jsliang 覺得自己還是比較薄弱的,如果小伙伴們跟 jsliang 一樣,也想豐富下這方面知識,歡迎一起刷 LeetCode 共同進步:

十二 其他

返回目錄

在 【其他】 這章,原本 jsliang 想談?wù)劽嬖囍械囊恍┬〖记?,例如談薪;或者講講 HR 面需要詢問的問題,例如工作時長、加班機制、調(diào)薪機制等……

但是,最終看來,jsliang 的經(jīng)歷還是有所欠缺,所經(jīng)歷的面試不夠 “盛大”,所以說出的話可能就是 “胡言亂語”、“誤導(dǎo)觀眾”,故在此就不獻丑了,如果小伙伴們想知道更多,可以通過 QQ 群:798961601 找到我。

☆ 目前 jsliang 通過 3 天的請假,去了 5 場面試,收獲了 3 份 offer。
☆ 如果小伙伴不知道簡歷該怎么寫、面試總是鎮(zhèn)靜不下來、總感覺面試沒譜,可以先找 jsliang 聊聊,我會講講個人的面試經(jīng)歷,以及聽到的其他小伙伴的經(jīng)歷~

十三 總結(jié)

返回目錄

在觀看這篇文章的過程中,小伙伴可能會有這些疑問:

  1. 看完覺得不過癮?。∧阍趺淳瓦@么 “短” ?。?/strong>

回答

系列套餐你值得擁有!

  1. 你這雜七雜八的都寫了什么呀?看完我暈乎了!

回答

每個人的學(xué)習(xí)經(jīng)歷是不同的,所擁有的技術(shù)、知識點以及工作經(jīng)驗等都是不同的。

所以 jsliang 的目的是通過這篇文章充實自己的同時,順帶挖掘自己的不足,例如面向?qū)ο笤燧喿?、算法問題等讓 jsliang 想進一步折騰,并應(yīng)用到工作中。

因此,小伙伴應(yīng)該根據(jù)自己實際去擴展補充屬于自己的知識點。

畢竟了解自己的,只有自己!

  1. 好像你這里寫得也不是很全???看完我還是一知半解的!

回答

每個人的目的都是不同的,不可能一篇文章寫完所有知識點,同時有些知識點可能 jsliang 也不感興趣、或者 jsliang 的層次不夠,接觸不到。

并且每個面試官都可能有自己的一套面試題,如果 jsliang 能將所有的面試題都寫出來,那還需要面試官做啥,大家都像考國家證書一樣直接電腦考試吧~(我也期待?。。。?/p>

如果小伙伴對文章存有疑問,想快速得到回復(fù)。
或者小伙伴對 jsliang 個人的前端文檔庫感興趣,也想將自己的前端知識整理出來。
或者小伙伴對文章后續(xù)的更新感興趣,掌握更多的面試技巧。
歡迎加 QQ 群一起探討:798961601。

十四 參考文獻

返回目錄

本文中的許多內(nèi)容,也許小伙伴看了會覺得眼熟,因為它們大部分是 jsliang 參考大量文獻,再經(jīng)過刷選整理,最后根據(jù)自己理解后的一些闡述。

下面是個人覺得非常優(yōu)秀的文章。

14.1 關(guān)于面試

返回目錄

  1. 《一位前端 2018 絕地求生記》
  2. 《中高級前端大廠面試秘籍,為你保駕護航金三銀四,直通大廠(上)》
  3. 《InterviewMap》
  4. 《一篇文章搞定前端面試》
  5. 《微信小程序必知面試題》
  6. 《微信小程序面試題,附答案》
  7. 《小程序踩過的那些面試題坑,附答案解決方法》

14.2 關(guān)于 HTML

返回目錄

  1. 《前端工程師手冊》
  2. 《HTML 教程- (HTML5 標(biāo)準(zhǔn)) - 菜鳥教程》
  3. 《前端分享之cookie的使用及單點登錄》
  4. 《Cookie、session和localStorage、以及sessionStorage之間的區(qū)別》

14.3 關(guān)于 CSS

返回目錄

  1. 《前端工程師手冊》
  2. 《CSS 權(quán)威指南》
  3. 《CSS 揭秘》
  4. 《CSS 世界》
  5. 《我對BFC的理解》
  6. 《CSS實現(xiàn)垂直居中的常用方法》
  7. 《CSS 用 position: absolute 與 transform 來居中塊級元素的問題》
  8. 《css常見布局》
  9. 《CSS3 圓角》
  10. 《CSS3 漸變(Gradients)》
  11. 《CSS3 transition 屬性》
  12. 《CSS3 transform 屬性》
  13. 《CSS3 animation(動畫) 屬性》
  14. 《CSS3 box-shadow 屬性》
  15. 《個人總結(jié)(css3新特性)》

14.4 關(guān)于 JS

返回目錄

  1. 【推薦】《JavaScript - MDN》
  2. 《小邵教你玩轉(zhuǎn)ES6》
  3. 《小邵教你玩轉(zhuǎn)JS面向?qū)ο蟆?/a>
  4. 《實現(xiàn)雙向綁定Proxy比defineproperty優(yōu)劣如何》
  5. 《Vue 中關(guān)于 $emit 的用法》
  6. 《JavaScript 世界萬物誕生記》
  7. 《js中的new()到底做了些什么??》
  8. 《MDN Function.prototype.call()》
  9. 《JavaScript中的call、apply、bind深入理解》
  10. 《箭頭函數(shù) - 廖雪峰》
  11. 《ECMAScript 6 入門 - 阮一峰》
  12. 《Vue原理解析之Virtual Dom》
  13. 《virtual-dom(Vue實現(xiàn))簡析》
  14. 《Vue.nextTick 的原理和用途》

14.5 關(guān)于其他

返回目錄

  1. 《前端性能優(yōu)化最佳實踐》
  2. 《到底什么是前端工程化、模塊化、組件化》
  3. 《【前端工程化系列】簡談前端模塊化開發(fā)與開發(fā)規(guī)范》
  4. 《個人關(guān)于模塊化的理解》
  5. 《組件化開發(fā)和模塊化開發(fā)概念辨析》
  6. 《JavaScript模塊化 --- Commonjs、AMD、CMD、es6 modules》
  7. 《淺談什么是前端工程化》
  8. 《前端分享之cookie的使用及單點登錄》
  9. 《Cookie、session和localStorage、以及sessionStorage之間的區(qū)別》
  10. 《網(wǎng)絡(luò)分層TCP/IP 與HTTP》

十五 網(wǎng)友反饋

返回目錄

查看了下掘金評論區(qū),感謝各位大大的反饋,由于本人將于 2019年4月1日 入職,故將一些個人覺得不錯的自己沒有察覺的知識點記錄下來,區(qū)分于原文,更為了猴年馬月后的下一次跳槽進一步完善。

意思就是,jsliang 這貨懶得改原文了,小伙伴們看著這里進行知識點補充

  • 閉包定義

函數(shù) A 里面包含了 函數(shù) B,而 函數(shù) B 里面使用了 函數(shù) A 的變量,函數(shù) B 被 return 了出去,那么 函數(shù) B 被稱為閉包。

  • box-sizing 屬性

當(dāng)值為 border-box 時,寬度 width = content + padding + border,包含內(nèi)邊距與邊框。

當(dāng)值為 content-box 時,寬度 width = content,不包含內(nèi)邊距與邊框。

  • em

em 是一個相對的大小,這里的相對于元素父元素的 font-size

  • Side Project

Side Project 對應(yīng)的中文就是副業(yè)、業(yè)余項目或者小項目。

感興趣的小伙伴可以去了解一下。

  • pushshift 系列

這里原文已備注是有誤的,只是一時沒空,沒有修改。

  • CSS 選擇器加載順序

原文:!important -> 行內(nèi)樣式 -> #id -> .class -> 元素和偽元素 -> * -> 繼承 -> 默認(rèn)

網(wǎng)友:“應(yīng)該是最后的優(yōu)先級最高?!?/p>

這里最后的優(yōu)先級最高應(yīng)該是指同等級優(yōu)先級覆蓋。瀏覽器通過 CSSParser 將 CSS 解析成 CSS Rule Tree 的時候,沒錯的話應(yīng)該是按照原文中的排序先加載,然后同等級的時候,后面的屬性覆蓋前面的屬性。

  • ARIA

對于 HTML5 的語義化,ARIA 的意思是 Accessible Rich Internet Application,aria-* 的作用就是描述這個 Tag 在可視化的情境中的具體信息。例如:

  1. aria-label:為組件指定內(nèi)置的文本標(biāo)簽,用來替代開發(fā)者沒有使用 <label> 標(biāo)簽
  2. aria-labelledby:會讀取與此具有相同的 id 名的值

詳情可參考張鑫旭的 《WAI-ARIA無障礙網(wǎng)頁應(yīng)用屬性完全展示》

  • sessionStorage 和 localStorage

文章描述不夠詳細。

  • 兩列布局/三列布局
  1. child-tow 中設(shè)置 width: 100% 的時候 child-one 的寬度會隨機而變,設(shè)置 flex: 1 就不會。所以看個人需求進行設(shè)置。
  2. 文章中沒有講到應(yīng)對兼容性怎么設(shè)置,可以考慮使用 float 進行相關(guān)的布局。
  • 淺拷貝與深拷貝

可參考文章:《深拷貝的終極探索(90%的人不知道)》

  • Promiseasync/await

文章描述不夠詳細。

  • 跨域

本來打算寫的,后面沒時間,給我刪了這塊,評論區(qū)有篇文獻參考:

《九種跨域方式實現(xiàn)原理(完整版)》

以上,即為目前評論區(qū)的補充,感謝各位小伙伴的點贊支持。


jsliang 廣告推送:
也許小伙伴想了解下云服務(wù)器
或者小伙伴想買一臺云服務(wù)器
或者小伙伴需要續(xù)費云服務(wù)器
歡迎點擊 云服務(wù)器推廣 查看!


jsliang 的文檔庫梁峻榮 采用 知識共享 署名-非商業(yè)性使用-相同方式共享 4.0 國際 許可協(xié)議進行許可。
基于github.com/LiangJunron…上的作品創(chuàng)作。
本許可協(xié)議授權(quán)之外的使用權(quán)限可以從 creativecommons.org/licenses/by… 處獲得。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服