前端面試題整理
- 1、前端需要注意哪些 SEO
- 2、 <img> 的 title 和 alt 有什么區別
- 3、 HTTP 的幾種請求方法用途
- 4、從瀏覽器地址欄輸入 url 到顯示頁面的步驟
- 5、如何進行網站性能優化
- 6、HTTP狀態碼及其含義
- 7、語義化的理解
- 8、介紹一下你對瀏覽器內核的理解
- 9、 html5 有哪些新特性、移除了那些元素?
- 10、 HTML5 的離線儲存怎么使用,工作原理能不能解釋一下?
- 11、瀏覽器是怎么對 HTML5 的離線儲存資源進行管理和加載的呢
- 12、請描述一下 cookies , sessionStorage 和 localStorage 的區別
- 13、 iframe 有那些缺點?
- 14、 WEB 標準以及W3C標準是什么?
- 15、 xhtml 和 html 有什么區別?
- 16、 Doctype 作用? 嚴格模式與混雜模式如何區分?它們有何意義?
- 17、行內元素有哪些?塊級元素有哪些? 空( void )元素有那些?行內元素和塊級元素有什么區別?
- 18、 HTML 全局屬性( global attribute )有哪些
$CSS部分
- 1、 css sprite 是什么,有什么優缺點
- 2、 display: none; 與 visibility: hidden ;的區別
- 3、 link 與 @import 的區別
- 4、什么是 FOUC? 如何避免
- 5、如何創建塊級格式化上下文( block formatting context ), BFC 有什么用
- 7、清除浮動的幾種方式,各自的優缺點
- 8、為什么要初始化 CSS 樣式?
- 9、 css3 有哪些新特性
- 10、 display 有哪些值?說明他們的作用
- 11、介紹一下標準的CSS的盒子模型?低版本IE的盒子模型有什么不同的?
- 12、 CSS 優先級算法如何計算?
- 13、對 BFC 規范的理解?
- 14、談談浮動和清除浮動
- 15、 position 的值, relative 和absolute`定位原點是
- 16、 display:inline-block 什么時候不會顯示間隙?(攜程)
- 17、 PNG,GIF,JPG 的區別及如何選
$JavaScript
- 1、閉包
- 2、說說你對作用域鏈的理解
- 3、 JavaScript 原型,原型鏈 ? 有什么特點?
- 4、請解釋什么是事件代理
- 5、 Javascript 如何實現繼承?
- 6、談談 This 對象的理解
- 7、事件模型
- 8、 new 操作符具體干了什么呢?
- 9、 Ajax 原理
- 11、模塊化開發怎么做?
- 12、異步加載 JS 的方式有哪些?
- 13、那些操作會造成內存泄漏?
- 14、 XML 和 JSON 的區別?
- 15、談談你對 webpack 的看法
- 17、常見 web 安全及防護原理
- 18、用過哪些設計模式?
- 19、為什么要有同源限制?
- 20、 offsetWidth/offsetHeight , clientWidth/clientHeight 與 scrollWidth/scrollHeight 的區別
- 21、 javascript 有哪些方法定義對象
- 22、常見兼容性問題?
- 22、說說你對 promise 的了解
- 23、你覺得 jQuery 源碼有哪些寫的好的地方
- 25、 Node 的應用場景
- 26、談談你對 AMD 、 CMD 的理解
- 27、那些操作會造成內存泄漏?
- 28、 web 開發中會話跟蹤的方法有哪些
- 29、介紹 js 的基本數據類型
- 30、介紹 js 有哪些內置對象?
- 31、說幾條寫 JavaScript 的基本規范?
- 32、 JavaScript 有幾種類型的值?,你能畫一下他們的內存圖嗎?
- 33、 javascript 創建對象的幾種方式?
- 34、 eval 是做什么的?
- 35、 null,undefined 的區別?
- 36、 [“1”, “2”, “3”].map(parseInt) 答案是多少?
- 37、 javascript 代碼中的 ”use strict” ;是什么意思 ? 使用它區別是什么?
- 38、 JSON 的了解?
- 39、js延遲加載的方式有哪些?
- 40、同步和異步的區別?
- 41、漸進增強和優雅降級
- 42、 defer 和 async
- 43、說說嚴格模式的限制
- 44、 attribute 和 property 的區別是什么?
- 45、談談你對 ES6 的理解
$編程題
- 1、寫一個通用的事件偵聽器函數
- 2、如何判斷一個對象是否為數組
- 3、冒泡排序
- 4、快速排序
- 5、編寫一個方法 求一個字符串的字節長度
$其他
- 1、談談你對重構的理解
- 2、什么樣的前端代碼是好的
- 3、對前端工程師這個職位是怎么樣理解的?它的前景會怎么樣?
- 4、你覺得前端工程的價值體現在哪
- 5、平時如何管理你的項目?
人事面
- 面試完你還有什么問題要問的嗎
- 你有什么愛好?
- 你最大的優點和缺點是什么?
- 你為什么會選擇這個行業,職位?
- 你覺得你適合從事這個崗位嗎?
- 你有什么職業規劃?
- 你對工資有什么要求?
- 如何看待前端開發?
- 未來三到五年的規劃是怎樣的?
一些問題
- 你的項目中技術難點是什么?
- 遇到了什么問題?
- 你是怎么解決的?
- 最近在看哪些前端方面的書?
- 平時是如何學習前端開發的?
- 為什么大型應用需要從多個域名請求資源?
- 什么樣的頁面具有良好的用戶體驗?
- 是否了解 Web 注入攻擊,說下原理,最- 常見的兩種攻擊( XSS 和 CSRF )了解到什么程度
$HTML, HTTP,web綜合問題
1、前端需要注意哪些SEO
- 合理的 title 、 description 、 keywords :搜索對著三項的權重逐個減小,title值強調重點即可,重要關鍵詞出現不要超過2次,而且要靠前,不同頁面 title 要有所不同; description 把頁面內容高度概括,長度合適,不可過分堆砌關鍵詞,不同頁面 description 有所不同; keywords 列舉出重要關鍵詞即可
- 語義化的 HTML 代碼,符合W3C規范:語義化代碼讓搜索引擎容易理解網頁
- 重要內容 HTML 代碼放在最前:搜索引擎抓取 HTML 順序是從上到下,有的搜索引擎對抓取長度有限制,保證重要內容一定會被抓取
- 重要內容不要用 js 輸出:爬蟲不會執行js獲取內容
- 少用 iframe :搜索引擎不會抓取 iframe 中的內容
- 非裝飾性圖片必須加 alt
- 提高網站速度:網站速度是搜索引擎排序的一個重要指標
2、 <img> 的 title 和 alt 有什么區別
- 通常當鼠標滑動到元素上的時候顯示
- alt 是 <img> 的特有屬性,是圖片內容的等價描述,用于圖片無法加載時顯示、讀屏器閱讀圖片。可提圖片高可訪問性,除了純裝飾圖片外都必須設置有意義的值,搜索引擎會重點分析。
3、HTTP的幾種請求方法用途
-
1、 GET 方法
- 發送一個請求來取得服務器上的某一資源
-
2、 POST 方法
- 向 URL 指定的資源提交數據或附加新的數據 </ul> </li>
-
3、 PUT 方法
- 跟 POST 方法很像,也是想服務器提交數據。但是,它們之間有不同。PUT指定了資源在服務器上的位置,而 POST 沒有 </ul> </li>
-
4、 HEAD 方法
- 只請求頁面的首部 </ul> </li>
-
5、 DELETE 方法
- 刪除服務器上的某資源 </ul> </li>
-
6、 OPTIONS 方法
- 它用于獲取當前 URL 所支持的方法。如果請求成功,會有一個 Allow 的頭包含類似 “GET,POST” 這樣的信息 </ul> </li>
-
7、 TRACE 方法
- TRACE 方法被用于激發一個遠程的,應用層的請求消息回路 </ul> </li>
-
8、 CONNECT 方法
- 把請求連接轉換到透明的 TCP/IP 通道 </ul> </li> </ul>
- 瀏覽器根據請求的 URL 交給 DNS 域名解析,找到真實 IP ,向服務器發起請求;
- 服務器交給后臺處理完成后返回數據,瀏覽器接收文件( HTML、JS、CSS 、圖象等);
- 瀏覽器對加載到的資源( HTML、JS、CSS 等)進行語法解析,建立相應的內部數據結構(如 HTML 的 DOM );
- 載入解析到的資源文件,渲染頁面,完成。
-
content 方面
- 減少 HTTP 請求:合并文件、 CSS 精靈、 inline Image
- 減少 DNS 查詢: DNS 緩存、將資源分布到恰當數量的主機名
- 減少 DOM 元素數量
-
Server 方面
- 使用 CDN
- 配置 ETag
- 對組件使用 Gzip 壓縮
-
Cookie 方面
- 減小 cookie 大小
-
css 方面
- 將樣式表放到頁面頂部
- 不使用 CSS 表達式
- 使用 <link> 不使用 @import
-
Javascript 方面
- 將腳本放到頁面底部
- 將 javascript 和 css 從外部引入
- 壓縮 javascript 和 css
- 刪除不需要的腳本
- 減少 DOM 訪問
-
圖片方面
- 優化圖片:根據實際顏色需要選擇色深、壓縮
- 優化 css 精靈
- 不要在 HTML 中拉伸圖片
- 1XX :信息狀態碼
- 100 Continue 繼續,一般在發送 post 請求時,已發送了 http header 之后服務端將返回此信息,表示確認,之后發送具體參數信息
- 2XX :成功狀態碼
- 200 OK 正常返回信息
- 201 Created 請求成功并且服務器創建了新的資源
- 202 Accepted 服務器已接受請求,但尚未處理 </ul> </li>
- 3XX :重定向
- 301 Moved Permanently 請求的網頁已永久移動到新位置。
- 302 Found 臨時性重定向。
- 303 See Other 臨時性重定向,且總是使用 GET 請求新的 URI 。
- 304 Not Modified 自從上次請求后,請求的網頁未修改過。 </ul> </li>
- 4XX :客戶端錯誤
- 400 Bad Request 服務器無法理解請求的格式,客戶端不應當嘗試再次使用相同的內容發起請求。
- 401 Unauthorized 請求未授權。
- 403 Forbidden 禁止訪問。
- 404 Not Found 找不到如何與 URI 相匹配的資源。 </ul> </li>
- 5XX: 服務器錯誤
- 500 Internal Server Error 最常見的服務器端錯誤。
- 503 Service Unavailable 服務器端暫時無法處理請求(可能是過載或維護)。 </ul> </li> </ul>
- 用正確的標簽做正確的事情!
- html 語義化就是讓頁面的內容結構化,便于對瀏覽器、搜索引擎解析;
- 在沒有樣式 CSS 情況下也以一種文檔格式顯示,并且是容易閱讀的。
- 搜索引擎的爬蟲依賴于標記來確定上下文和各個關鍵字的權重,利于 SEO 。
- 使閱讀源代碼的人對網站更容易將網站分塊,便于閱讀維護理解
-
主要分成兩部分:渲染引擎( layout engineer 或 Rendering Engine )和 JS 引擎
-
渲染引擎:負責取得網頁的內容( HTML 、 XML 、圖像等等)、整理訊息(例如加入 CSS 等),以及計算網頁的顯示方式,然后會輸出至顯示器或打印機。瀏覽器的內核的不同對于網頁的語法解釋會有不同,所以渲染的效果也不相同。所有網頁瀏覽器、電子郵件客戶端以及其它需要編輯、顯示網絡內容的應用程序都需要內核
- JS 引擎則:解析和執行 javascript 來實現網頁的動態效果
- 最開始渲染引擎和 JS 引擎并沒有區分的很明確,后來JS引擎越來越獨立,內核就傾向于只指渲染引擎
-
HTML5 現在已經不是 SGML 的子集,主要是關于圖像,位置,存儲,多任務等功能的增加
- 繪畫 canvas
- 用于媒介回放的 video 和 audio 元素
- 本地離線存儲 localStorage 長期存儲數據,瀏覽器關閉后數據不丟失
- sessionStorage 的數據在瀏覽器關閉后自動刪除
- 語意化更好的內容元素,比如 article 、 footer 、 header 、 nav 、 section
- 表單控件, calendar 、 date 、 time 、 email 、 url 、 search
- 新的技術 webworker , websocket , Geolocation
-
移除的元素:
- 純表現的元素: basefont , big , center , font , s , strike, tt,u`
- 對可用性產生負面影響的元素: frame , frameset , noframes </ul> </li>
-
支持 HTML5 新標簽:
- IE8/IE7/IE6 支持通過 document.createElement 方法產生的標簽
- 可以利用這一特性讓這些瀏覽器支 持HTML5 新標簽
- 瀏覽器支持新標簽后,還需要添加標簽默認的樣式 </ul> </li>
-
當然也可以直接使用成熟的框架、比如 html5shim
</ul>
-
在用戶沒有與因特網連接時,可以正常訪問站點或應用,在用戶與因特網連接時,更新用戶機器上的緩存文件
-
原理: HTML5 的離線存儲是基于一個新建的 .appcache 文件的緩存機制(不是存儲技術),通過這個文件上的解析清單離線存儲資源,這些資源就會像 cookie 一樣被存儲了下來。之后當網絡在處于離線狀態下時,瀏覽器會通過被離線存儲的數據進行頁面展示
-
如何使用:
- 頁面頭部像下面一樣加入一個 manifest 的屬性;
- 在 cache.manifest 文件的編寫離線存儲的資源
- 在離線狀態時,操作 window.applicationCache 進行需求實現
CACHE MANIFEST
v0.11
CACHE: js/app.js css/style.css NETWORK: resourse/logo.png FALLBACK: / /offline.html </pre>
11、瀏覽器是怎么對 HTML5 的離線儲存資源進行管理和加載的呢
-
在線的情況下,瀏覽器發現 html 頭部有 manifest 屬性,它會請求 manifest 文件,如果是第一次訪問 app ,那么瀏覽器就會根據manifest文件的內容下載相應的資源并且進行離線存儲。如果已經訪問過 app 并且資源已經離線存儲了,那么瀏覽器就會使用離線的資源加載頁面,然后瀏覽器會對比新的 manifest 文件與舊的 manifes t文件,如果文件沒有發生改變,就不做任何操作,如果文件改變了,那么就會重新下載文件中的資源并進行離線存儲。
-
離線的情況下,瀏覽器就直接使用離線存儲的資源。
12、請描述一下 cookies , sessionStorage 和 localStorage 的區別?
- cookie 是網站為了標示用戶身份而儲存在用戶本地終端(Client Side)上的數據(通常經過加密)
- cookie數據始終在同源的http請求中攜帶(即使不需要),記會在瀏覽器和服務器間來回傳遞
- sessionStorage 和 localStorage 不會自動把數據發給服務器,僅在本地保存
-
存儲大小:
- cookie 數據大小不能超過4k
- sessionStorage 和 localStorage 雖然也有存儲大小的限制,但比 cookie 大得多,可以達到5M或更大
-
有期時間:
- localStorage 存儲持久數據,瀏覽器關閉后數據不丟失除非主動刪除數據
- sessionStorage 數據在當前瀏覽器窗口關閉后自動刪除
- cookie 設置的 cookie 過期時間之前一直有效,即使窗口或瀏覽器關閉 </ul> </li> </ul>
- iframe 會阻塞主頁面的 Onload 事件
- 搜索引擎的檢索程序無法解讀這種頁面,不利于 SEO
- iframe 和主頁面共享連接池,而瀏覽器對相同域的連接有限制,所以會影響頁面的并行加載
- 使用 iframe 之前需要考慮這兩個缺點。如果需要使用 iframe ,最好是通過 javascript 動態給 iframe 添加 src 屬性值,這樣可以繞開以上兩個問題
- 標簽閉合、標簽小寫、不亂嵌套、使用外鏈 css 和 js 、結構行為表現的分離
-
一個是功能上的差別
- 主要是 XHTML 可兼容各大瀏覽器、手機以及 PDA ,并且瀏覽器也能快速正確地編譯網頁
-
另外是書寫習慣的差別
- XHTML 元素必須被正確地嵌套,閉合,區分大小寫,文檔必須擁有根元素 </ul> </li> </ul>
- 頁面被加載的時, link 會同時被加載,而 @imort 頁面被加載的時, link 會同時被加載,而 @import 引用的 CSS 會等到頁面被加載完再加載
import 只在 IE5 以上才能識別,而 link 是 XHTML 標簽,無兼容問題
link 方式的樣式的權重 高于 @import 的權重 - <!DOCTYPE> 聲明位于文檔中的最前面,處于 <html> 標簽之前。告知瀏覽器的解析器, 用什么文檔類型 規范來解析這個文檔
- 嚴格模式的排版和 JS 運作模式是 以該瀏覽器支持的最高標準運行
- 在混雜模式中,頁面以寬松的向后兼容的方式顯示。模擬老式瀏覽器的行為以防止站點無法工作。 DOCTYPE 不存在或格式不正確會導致文檔以混雜模式呈現
- 行內元素有: a b span img input select strong
- 塊級元素有: div ul ol li dl dt dd h1 h2 h3 h4…p
- 空元素: <br> <hr> <img> <input> <link> <meta>
- 行內元素不可以設置寬高,不獨占一行
- 塊級元素可以設置寬高,獨占一行
- class :為元素設置類標識
- data-* : 為元素增加自定義屬性
- draggable : 設置元素是否可拖拽
- id : 元素 id ,文檔內唯一
- lang : 元素內容的的語言
- style : 行內 css 樣式
- title : 元素相關的建議信息
-
概念:將多個小圖片拼接到一個圖片中。通過 background-position 和元素尺寸調節需要顯示的背景圖案。
-
優點:
- 減少 HTTP 請求數,極大地提高頁面加載速度
- 增加圖片信息重復度,提高壓縮比,減少圖片大小
- 更換風格方便,只需在一張或幾張圖片上修改顏色或樣式即可實現
-
缺點:
- 圖片合并麻煩
- 維護麻煩,修改一個圖片可能需要從新布局整個圖片,樣式 </ul> </li> </ul>
-
聯系:它們都能讓元素不可見
-
區別:
- display:none ;會讓元素完全從渲染樹中消失,渲染的時候不占據任何空間; visibility: hidden ;不會讓元素從渲染樹消失,渲染師元素繼續占據空間,只是內容不可見
- display: none ;是非繼承屬性,子孫節點消失由于元素從渲染樹消失造成,通過修改子孫節點屬性無法顯示 ;visibility: hidden; 是繼承屬性,子孫節點消失由于繼承了 hidden ,通過設置 visibility: visible; 可以讓子孫節點顯式
- 修改常規流中元素的 display 通常會造成文檔重排。修改 visibility 屬性只會造成本元素的重繪。
- 讀屏器不會讀取 display: none ;元素內容;會讀取 visibility: hidden; 元素內容
3、 link 與 @import 的區別
- link 是 HTML 方式, @import 是CSS方式
- link 最大限度支持并行下載, @import 過多嵌套導致串行下載,出現 FOUC
- link 可以通過 rel="alternate stylesheet" 指定候選樣式
- 瀏覽器對 link 支持早于 @import ,可以使用 @import 對老瀏覽器隱藏樣式
- @import 必須在樣式規則之前,可以在css文件中引用其他文件
- 總體來說: link 優于 @import
4、什么是FOUC?如何避免
- Flash Of Unstyled Content :用戶定義樣式表加載之前瀏覽器使用默認樣式顯示文檔,用戶樣式加載渲染之后再從新顯示文檔,造成頁面閃爍。
- 解決方法 :把樣式表放到文檔的 head
5、如何創建塊級格式化上下文(block formatting context),BFC有什么用
-
創建規則:
- 根元素
- 浮動元素( float 不是 none )
- 絕對定位元素( position 取值為 absolute 或 fixed )
- display 取值為 inline-block , table-cell , table-caption , flex , inline-flex 之一的元素
- overflow 不是 visible 的元素
-
作用:
- 可以包含浮動元素
- 不被浮動元素覆蓋
- 阻止父子元素的 margin 折疊 </ul> </li> </ul>
- 如果 display 為 none ,那么 position 和 float 都不起作用,這種情況下元素不產生框
- 否則,如果 position 值為 absolute 或者 fixed ,框就是絕對定位的, float 的計算值為 none , display 根據下面的表格進行調整。
- 否則,如果 float 不是 none ,框是浮動的, display 根據下表進行調整
- 否則,如果元素是根元素, display 根據下表進行調整
- 其他情況下 display 的值為指定值
- 總結起來: 絕對定位、浮動、根元素都需要調整 display
- 使用空標簽清除浮動 clear:both (缺點,增加無意義的標簽)
- 使用 overflow:auto (使用 zoom:1 用于兼容 IE ,缺點:內部寬高超過父級 div 時,會出現滾動條)
- 用 afert 偽元素清除浮動( IE8 以上和非 IE 瀏覽器才支持,目前:大型網站都有使用
- 因為瀏覽器的兼容問題,不同瀏覽器對有些標簽的默認值是不同的,如果沒對 CSS 初始化往往會出現瀏覽器之間的頁面顯示差異。
- 當然,初始化樣式會對 SEO 有一定的影響,但魚和熊掌不可兼得,但力求影響最小的情況下初始化
- 新增各種 css 選擇器
- 圓角 border-radius
- 多列布局
- 陰影和反射
- 文字特效 text-shadow
- 線性漸變
- 旋轉 transform
- p:first-of-type 選擇屬于其父元素的首個 <p> 元素的每個 <p> 元素。
- p:last-of-type 選擇屬于其父元素的最后 <p> 元素的每個 <p> 元素。
- p:only-of-type 選擇屬于其父元素唯一的 <p> 元素的每個 <p> 元素。
- p:only-child 選擇屬于其父元素的唯一子元素的每個 <p> 元素。
- p:nth-child(2) 選擇屬于其父元素的第二個子元素的每個 <p> 元素。
- :after 在元素之前添加內容,也可以用來做清除浮動。
- :before 在元素之后添加內容
- :enabled
- :disabled 控制表單控件的禁用狀態。
- :checked 單選框或復選框被選中
- block 象塊類型元素一樣顯示。
- none 缺省值。象行內元素類型一樣顯示。
- inline-block 象行內元素一樣顯示,但其內容象塊類型元素一樣顯示。
- list-item 象塊類型元素一樣顯示,并添加樣式列表標記。
- table 此元素會作為塊級表格來顯示
- inherit 規定應該從父元素繼承 display 屬性的值
- 有兩種, IE 盒子模型、 W3C 盒子模型;
- 盒模型: 內容(content)、填充( padding )、邊界( margin )、 邊框( border );
- 區 別: IE 的c ontent 部分把 border 和 padding 計算了進去;
- 優先級就近原則,同權重情況下樣式定義最近者為準
- 載入樣式以最后載入的定位為準
- 優先級為: !important > id > class > tag important 比 內聯優先級高
- 它決定了元素如何對其內容進行定位,以及與其他元素的關系和相互作用
- 浮動的框可以向左或向右移動,直到他的外邊緣碰到包含框或另一個浮動框的邊框為止。由于浮動框不在文檔的普通流中,所以文檔的普通流的塊框表現得就像浮動框不存在一樣。浮動的塊框會漂浮在文檔普通流的塊框上
- absolute :生成絕對定位的元素,相對于 static 定位以外的第一個父元素進行定位
- fixed :生成絕對定位的元素,相對于瀏覽器窗口進行定位
- relative :生成相對定位的元素,相對于其正常位置進行定位
- static 默認值。沒有定位,元素出現在正常的流中
- inherit 規定從父元素繼承 position 屬性的值
- 移除空格
- 使用 margin 負值
- 使用 font-size:0
- letter-spacing
- word-spacing
-
GIF
- 8 位像素, 256 色
- 無損壓縮
- 支持簡單動畫
- 支持 boolean 透明
- 適合簡單動畫
-
JPEG
- 顏色限于 256
- 有損壓縮
- 可控制壓縮質量
- 不支持透明
- 適合照片 </ul> </li>
- PNG
- 有 PNG8 和 truecolor PNG
- PNG8 類似 GIF 顏色上限為 256 ,文件小,支持 alpha 透明度,無動畫
- 適合圖標、背景、按鈕 </ul> </li> </ul>
-
閉包是指有權訪問另一個函數作用域中變量的函數,創建閉包的最常見的方式就是在一個函數內創建另一個函數,通過另一個函數訪問這個函數的局部變量,利用閉包可以突破作用鏈域
-
閉包的特性:
- 函數內再嵌套函數
- 內部函數可以引用外層的參數和變量
- 參數和變量不會被垃圾回收機制回收
說說你對閉包的理解
- 使用閉包主要是為了設計私有的方法和變量。閉包的優點是可以避免全局變量的污染,缺點是閉包會常駐內存,會增大內存使用量,使用不當很容易造成內存泄露。在js中,函數即閉包,只有函數才會產生作用域的概念
2、說說你對作用域鏈的理解
- 作用域鏈的作用是保證執行環境里有權訪問的變量和函數是有序的,作用域鏈的變量只能向上訪問,變量訪問到 window 對象即被終止,作用域鏈向下訪問變量是不被允許的
- 簡單的說,作用域就是變量與函數的可訪問范圍,即作用域控制著變量與函數的可見性和生命周期
3、JavaScript原型,原型鏈 ? 有什么特點?
- 每個對象都會在其內部初始化一個屬性,就是 prototype (原型),當我們訪問一個對象的屬性時
- 如果這個對象內部不存在這個屬性,那么他就會去 prototype 里找這個屬性,這 個prototype 又會有自己的 prototype ,于是就這樣一直找下去,也就是我們平時所說的原型鏈的概念
- 關系: instance.constructor.prototype = instance.__proto__
-
特點:
- JavaScript 對象是通過引用來傳遞的,我們創建的每個新對象實體中并沒有一份屬于自己的原型副本。當我們修改原型時,與之相關的對象也會繼承這一改變
-
當我們需要一個屬性的時, Javascript 引擎會先看當前對象中是否有這個屬性, 如果沒有的
- 就會查找他的 Prototype 對象是否有這個屬性,如此遞推下去,一直檢索到 Object 內建對象 </ul>
- 事件代理( Event Delegation ),又稱之為事件委托。是 JavaScript 中常用綁定事件的常用技巧。顧名思義,“事件代理”即是把原本需要綁定的事件委托給父元素,讓父元素擔當事件監聽的職務。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好處是可以提高性能
- 可以大量節省內存占用,減少事件注冊,比如在 table 上代理所有 td 的 click 事件就非常棒
- 可以實現當新增子對象時無需再次對其綁定
- 構造繼承
- 原型繼承
- 實例繼承
-
拷貝繼承
-
原型 prototype 機制或 apply 和 call 方法去實現較簡單,建議使用構造函數與原型混合方式
4、請解釋什么是事件代理
5、Javascript如何實現繼承?
functionParent(){ this.name = 'wang'; }
functionChild(){ this.age = 28; } Child.prototype = new Parent();//繼承了Parent,通過原型
var demo = new Child(); alert(demo.age); alert(demo.name);//得到被繼承的屬性 } </pre>
6、談談This對象的理解
- this 總是指向函數的直接調用者(而非間接調用者)
- 如果有 new 關鍵字, this 指向 new 出來的那個對象
- 在事件中, this 指向觸發這個事件的對象,特殊的是, IE 中的 attachEvent 中的 this 總是指向全局對象 Window
7、事件模型
- 冒泡型事件:當你使用事件冒泡時,子級元素先觸發,父級元素后觸發
- 捕獲型事件:當你使用事件捕獲時,父級元素先觸發,子級元素后觸發
- DOM 事件流:同時支持兩種事件模型:捕獲型事件和冒泡型事件
- 阻止冒泡:在 W3c 中,使用 stopPropagation() 方法;在IE下設置 cancelBubble = true
- 阻止捕獲:阻止事件的默認行為,例如 click - <a> 后的跳轉。在 W3c 中,使用 preventDefault() 方法,在 IE 下設置 window.event.returnValue = false
8、new操作符具體干了什么呢?
- 創建一個空對象,并且 this 變量引用該對象,同時還繼承了該函數的原型
- 屬性和方法被加入到 this 引用的對象中
- 新創建的對象由 this 所引用,并且最后隱式的返回 this
9、Ajax原理
- Ajax 的原理簡單來說是在用戶和服務器之間加了—個中間層( AJAX 引擎),通過 XmlHttpRequest 對象來向服務器發異步請求,從服務器獲得數據,然后用 javascrip t來操作 DOM 而更新頁面。使用戶操作與服務器響應異步化。這其中最關鍵的一步就是從服務器獲得請求數據
- Ajax 的過程只涉及 JavaScript 、 XMLHttpRequest 和 DOM 。 XMLHttpRequest 是 aja x的核心機制
// 1. 創建連接 var xhr = null; xhr = new XMLHttpRequest() // 2. 連接服務器 xhr.open('get', url, true) // 3. 發送請求 xhr.send(null); // 4. 接受請求 xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ if(xhr.status == 200){ success(xhr.responseText); } else { // fail fail && fail(xhr.status); } } }
10、如何解決跨域問題?
- jsonp 、 iframe 、 window.name 、 window.postMessage 、服務器上設置代理頁面
11、模塊化開發怎么做?
- 立即執行函數,不暴露私有成員
var module1 = (function(){ var _count = 0; var m1 = function(){ //... }; var m2 = function(){ //... }; return { m1 : m1, m2 : m2 }; })();
12、異步加載JS的方式有哪些?
- defer,只支持 IE
- async :
- 創建 script ,插入到 DOM 中,加載完畢后 callBack
13、那些操作會造成內存泄漏?
- 內存泄漏指任何對象在您不再擁有或需要它之后仍然存在
- setTimeout 的第一個參數使用字符串而非函數的話,會引發內存泄漏
- 閉包使用不當
14、XML和JSON的區別?
-
數據體積方面
- JSON 相對 于XML 來講,數據的體積小,傳遞的速度更快些。
-
數據交互方面
- JSON 與 JavaScript 的交互更加方便,更容易解析處理,更好的數據交互 </ul> </li>
-
數據描述方面
- JSON 對數據的描述性比 XML 較差 </ul> </li>
-
傳輸速度方面
- JSON 的速度要遠遠快于 XML </ul> </li> </ul>
- WebPack 是一個模塊打包工具,你可以使用 WebPack 管理你的模塊依賴,并編繹輸出模塊們所需的靜態文件。它能夠很好地管理、打包 Web 開發中所用到的 HTML 、 Javascript 、 CSS 以及各種靜態文件(圖片、字體等),讓開發過程更加高效。對于不同類型的資源, webpack 有對應的模塊加載器。 webpack 模塊打包器會分析模塊間的依賴關系,最后 生成了優化且合并后的靜態資源
- CommonJS 是服務器端模塊的規范, Node.js 采用了這個規范。 CommonJS 規范加載模塊是同步的,也就是說,只有加載完成,才能執行后面的操作。 AMD 規范則是非同步加載模塊,允許指定回調函數
- AMD 推薦的風格通過返回一個對象做為模塊對象, CommonJS 的風格通過對 module.exports 或 exports 的屬性賦值來達到暴露模塊對象的目的
-
sql 注入原理
- 就是通過把 SQL 命令插入到 Web 表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令
-
總的來說有以下幾點
- 永遠不要信任用戶的輸入,要對用戶的輸入進行校驗,可以通過正則表達式,或限制長度,對單引號和雙 "-" 進行轉換等
- 永遠不要使用動態拼裝SQL,可以使用參數化的 SQL 或者直接使用存儲過程進行數據查詢存取
- 永遠不要使用管理員權限的數據庫連接,為每個應用使用單獨的權限有限的數據庫連接
- 不要把機密信息明文存放,請加密或者 hash 掉密碼和敏感的信息 </ul> </li> </ul>
- Xss(cross-site scripting) 攻擊指的是攻擊者往 Web 頁面里插入惡意 html 標簽或者 javascript 代碼。比如:攻擊者在論壇中放一個看似安全的鏈接,騙取用戶點擊后,竊取 cookie 中的用戶私密信息;或者攻擊者在論壇中加一個惡意表單,當用戶提交表單的時候,卻把信息傳送到攻擊者的服務器中,而不是用戶原本以為的信任站點
- 首先代碼里對用戶輸入的地方和變量都需要仔細檢查長度和對 ”<”,”>”,”;”,”’” 等字符做過濾;其次任何內容寫到頁面之前都必須加以encode,避免不小心把 html tag 弄出來。這一個層面做好,至少可以堵住超過一半的XSS 攻擊
-
XSS 是獲取信息,不需要提前知道其他用戶頁面的代碼和數據包。 CSRF 是代替用戶完成指定的動作,需要知道其他用戶頁面的代碼和數據包。要完成一次 CSRF 攻擊,受害者必須依次完成兩個步驟
-
登錄受信任網站 A ,并在本地生成 Cookie
- 在不登出 A 的情況下,訪問危險網站 B
- 服務端的 CSRF 方式方法很多樣,但總的思想都是一致的,就是在客戶端頁面增加偽隨機數
- 通過驗證碼的方法
-
工廠模式:
- 工廠模式解決了重復實例化的問題,但還有一個問題,那就是識別問題,因為根本無法
- 主要好處就是可以消除對象間的耦合,通過使用工程方法而不是 new 關鍵字
-
構造函數模式
- 使用構造函數的方法,即解決了重復實例化的問題,又解決了對象識別的問題,該模式與工廠模式的不同之處在于
- 直接將屬性和方法賦值給 this 對象; </ul> </li> </ul>
- 同源策略指的是:協議,域名,端口相同,同源策略是一種安全協議
- 舉例說明:比如一個黑客程序,他利用 Iframe 把真正的銀行登錄頁面嵌到他的頁面上,當你使用真實的用戶名,密碼登錄時,他的頁面就可以通過 Javascript 讀取到你的表單中 input 中的內容,這樣用戶名,密碼就輕松到手了。
- offsetWidth/offsetHeight 返回值包含 content + padding + border ,效果與e.getBoundingClientRect()相同
- clientWidth/clientHeight 返回值只包含 content + padding ,如果有滾動條,也 不包含滾動條
- scrollWidth/scrollHeight 返回值包含 content + padding + 溢出內容的尺寸
- 對象字面量: var obj = {};
- 構造函數: var obj = new Object();
- Object.create(): var obj = Object.create(Object.prototype);
- png24 位的圖片在iE6瀏覽器上出現背景,解決方案是做成 PNG8
- 瀏覽器默認的 margin 和 padding 不同。解決方案是加一個全局的 *{margin:0;padding:0;} 來統一,,但是全局效率很低,一般是如下這樣解決:
19、為什么要有同源限制?
20、offsetWidth/offsetHeight,clientWidth/clientHeight與scrollWidth/scrollHeight的區別
21、javascript有哪些方法定義對象
22、常見兼容性問題?
body,ul,li,ol,dl,dt,dd,form,input,h1,h2,h3,h4,h5,h6,p{ margin:0; padding:0; }
- IE 下, event 對象有 x , y 屬性,但是沒有 pageX , pageY 屬性
- Firefox 下, event 對象有 pageX , pageY 屬性,但是沒有 x,y 屬性.
22、說說你對promise的了解
-
依照 Promise/A+ 的定義, Promise 有四種狀態:
-
pending: 初始狀態, 非 fulfilled 或 rejected.
-
fulfilled: 成功的操作.
-
rejected: 失敗的操作.
-
settled: Promise 已被 fulfilled 或 rejected ,且不是 pending
-
-
另外, fulfilled 與 rejected 一起合稱 settled
- Promise 對象用來進行延遲( deferred ) 和異步( asynchronous ) 計算 </ul>
- 構造一個 Promise ,最基本的用法如下:
Promise 的構造函數
var promise = new Promise(function(resolve, reject){
if (...) { // succeed resolve(result); } else { // fails reject(Error(errMessage)); } });
</pre>
-
Promise 實例擁有 then 方法(具有 then 方法的對象,通常被稱為 thenable )。它的使用方法如下:
promise.then(onFulfilled, onRejected)
-
接收兩個函數作為參數,一個在 fulfilled 的時候被調用,一個在 rejected 的時候被調用,接收參數就是 future , onFulfilled 對應 resolve , onRejected 對應 reject
23、你覺得jQuery源碼有哪些寫的好的地方
- jquery 源碼封裝在一個匿名函數的自執行環境中,有助于防止變量的全局污染,然后通過傳入 window 對象參數,可以使 window 對象作為局部變量使用,好處是當 jquery 中訪問 window 對象的時候,就不用將作用域鏈退回到頂層作用域了,從而可以更快的訪問window對象。同樣,傳入 undefined 參數,可以縮短查找 undefined 時的作用域鏈
- jquery 將一些原型屬性和方法封裝在了 jquery.prototype 中,為了縮短名稱,又賦值給了 jquery.fn ,這是很形象的寫法
- 有一些數組或對象的方法經常能使用到, jQuery 將其保存為局部變量以提高訪問速度
- jquery 實現的鏈式調用可以節約代碼,所返回的都是同一個對象,可以提高代碼效率
24、vue、react、angular
-
Vue.js
一個用于創建 web 交互界面的庫,是一個精簡的 MVVM 。它通過雙向數據綁定把 View 層和 Model 層連接了起來。實際的 DOM 封裝和輸出格式都被抽象為了 Directives 和 Filters -
AngularJS
是一個比較完善的前端 MVVM 框架,包含模板,數據雙向綁定,路由,模塊化,服務,依賴注入等所有功能,模板功能強大豐富,自帶了豐富的 Angular 指令 -
react
React 僅僅是 VIEW 層是 非死book 公司。推出的一個用于構建 UI 的一個庫,能夠實現服務器端的渲染。用了 virtual dom ,所以性能很好。
25、Node的應用場景
-
特點:
- 1、它是一個 Javascript 運行環境
- 2、依賴于 Chrome V8 引擎進行代碼解釋
- 3、事件驅動
- 4、非阻塞 I/O
- 5、單進程,單線程
-
優點:
- 高并發(最重要的優點) </ul> </li>
-
缺點:
- 1、只支持單 核CPU ,不能充分利用 CPU
- 2、可靠性低,一旦代碼某個環節崩潰,整個系統都崩潰 </ul> </li> </ul>
-
CommonJS 是服務器端模塊的規范, Node.js 采用了這個規范。 CommonJS 規范加載模塊是同步的,也就是說,只有加載完成,才能執行后面的操作。 AMD 規范則是非同步加載模塊,允許指定回調函數
-
AMD 推薦的風格通過返回一個對象做為模塊對象, CommonJS 的風格通過對 module.exports 或 exports 的屬性賦值來達到暴露模塊對象的目的
- 內存泄漏指任何對象在您不再擁有或需要它之后仍然存在
- setTimeout 的第一個參數使用字符串而非函數的話,會引發內存泄漏
- 閉包、控制臺日志、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)
- cookie
- session
- url 重寫
- 隱藏 input
- ip 地址
- Undefined 、 Null 、 Boolean 、 Number 、 String
- Object 是 JavaScript 中所有對象的父對象
- 數據封裝類對象: Object 、 Array 、 Boolean 、 Number 和 String
- 其他對象: Function 、 Arguments 、 Math 、 Date 、 RegExp 、 Error
- 不要在同一行聲明多個變量
- 請使用 ===/!== 來比較 true/false 或者數值
- 使用對象字面量替代 new Array 這種形式
- 不要使用全局函數
- Switch 語句必須帶有 default 分支
- If 語句必須使用大括號
- for-in 循環中的變量 應該使用 var 關鍵字明確限定作用域,從而避免作用域污
- 棧:原始數據類型( Undefined , Null , Boolean , Numbe r、 String )
- 堆:引用數據類型(對象、數組和函數)
- 兩種類型的區別是:存儲位置不同;
- 原始數據類型直接存儲在棧( stack )中的簡單數據段,占據空間小、大小固定,屬于被頻繁使用數據,所以放入棧中存儲;
- 引用數據類型存儲在堆( heap )中的對象,占據空間大、大小不固定,如果存儲在棧中,將會影響程序運行的性能;引用數據類型在棧中存儲了指針,該指針指向堆中該實體的起始地址。當解釋器尋找引用值時,會首先檢索其
- 在棧中的地址,取得地址后從堆中獲得實體
- 對象字面量的方式
26、談談你對AMD、CMD的理解
27、那些操作會造成內存泄漏?
28、web開發中會話跟蹤的方法有哪些
29、介紹js的基本數據類型
30、介紹js有哪些內置對象?
31、說幾條寫JavaScript的基本規范?
32、JavaScript有幾種類型的值?,你能畫一下他們的內存圖嗎?
33、javascript創建對象的幾種方式?
javascript 創建對象簡單的說,無非就是使用內置對象或各種自定義對象,當然還可以用 JSON ;但寫法有很多種,也能混合使用
person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
- 用 function 來模擬無參的構造函數
functionPerson(){} var person=new Person();//定義一個function,如果使用new"實例化",該function可以看作是一個Class person.name="Mark"; person.age="25"; person.work=function(){ alert(person.name+" hello..."); } person.work();
- 用 function 來模擬參構造函數來實現(用 this 關鍵字定義構造的上下文屬性)
functionPet(name,age,hobby){ this.name=name;//this作用域:當前對象 this.age=age; this.hobby=hobby; this.eat=function(){ alert("我叫"+this.name+",我喜歡"+this.hobby+",是個程序員"); } } var maidou =new Pet("麥兜",25,"coding");//實例化、創建對象 maidou.eat();//調用eat方法
- 用工廠方式來創建(內置對象)
var wcDog =new Object(); wcDog.name="旺財"; wcDog.age=3; wcDog.work=function(){ alert("我是"+wcDog.name+",汪汪汪......"); } wcDog.work();
- 用原型方式來創建
function Dog(){
} Dog.prototype.name="旺財"; Dog.prototype.eat=function(){ alert(this.name+"是個吃貨"); } var wangcai =new Dog(); wangcai.eat();
</pre>
- 用混合方式來創建
function Car(name,price){ this.name=name; this.price=price; } Car.prototype.sell=function(){ alert("我是"+this.name+",我現在賣"+this.price+"萬元"); } var camry =new Car("凱美瑞",27); camry.sell();
34、eval是做什么的?
- 它的功能是把對應的字符串解析成 JS 代碼并運行
- 應該避免使用 eval ,不安全,非常耗性能( 2 次,一次解析成 js 語句,一次執行)
- 由 JSON 字符串轉換為JSON對象的時候可以用 eval,var obj =eval('('+ str +')')
35、null,undefined 的區別?
- undefined 表示不存在這個值。
- undefined :是一個表示”無”的原始值或者說表示”缺少值”,就是此處應該有一個值,但是還沒有定義。當嘗試讀取時會返回 undefined
-
例如變量被聲明了,但沒有賦值時,就等于 undefined
-
null 表示一個對象被定義了,值為“空值”
- null : 是一個對象(空對象, 沒有任何屬性和方法)
-
例如作為函數的參數,表示該函數的參數不是對象;
-
在驗證 null 時,一定要使用 === ,因為 == 無法分別 null 和 undefined
36、[“1”, “2”, “3”].map(parseInt) 答案是多少?
- [1, NaN, NaN] 因為 parseInt 需要兩個參數 (val, radix) ,其中 radix 表示解析時用的基數。
- map 傳了 3 個 (element, index, array) ,對應的 radix 不合法導致解析失敗。
37、javascript 代碼中的”use strict”;是什么意思 ? 使用它區別是什么?
- use strict 是一種 ECMAscript 5 添加的(嚴格)運行模式,這種模式使得 Javascript 在更嚴格的條件下運行,使 JS 編碼更加規范化的模式,消除 Javascript 語法的一些不合理、不嚴謹之處,減少一些怪異行為
38、JSON 的了解?**
- JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式
-
它是基于 JavaScript 的一個子集。數據格式簡單, 易于讀寫, 占用帶寬小
-
JSON 字符串轉換為JSON對象:
var obj =eval('('+ str +')'); var obj = str.parseJSON(); var obj = JSON.parse(str);
- JSON 對象轉換為JSON字符串:
var last=obj.toJSONString(); var last=JSON.stringify(obj);
39、js延遲加載的方式有哪些?
- defer 和 async 、動態創建 DOM 方式(用得最多)、按需異步載入 js
40、同步和異步的區別?
- 同步:瀏覽器訪問服務器請求,用戶看得到頁面刷新,重新發請求,等請求完,頁面刷新,新內容出現,用戶看到新內容,進行下一步操作
- 異步:瀏覽器訪問服務器請求,用戶正常操作,瀏覽器后端進行請求。等請求完,頁面不刷新,新內容也會出現,用戶看到新內容
41、漸進增強和優雅降級
-
漸進增強 :針對低版本瀏覽器進行構建頁面,保證最基本的功能,然后再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗。
-
優雅降級 :一開始就構建完整的功能,然后再針對低版本瀏覽器進行兼容
42、defer和async
- defer 并行加載 js 文件,會按照頁面上 script 標簽的順序執行
- async 并行加載 js 文件,下載完成立即執行,不會按照頁面上 script 標簽的順序執行
43、說說嚴格模式的限制
- 變量必須聲明后再使用
- 函數的參數不能有同名屬性,否則報錯
- 不能使用 with 語句
- 禁止 this 指向全局對象
44、attribute和property的區別是什么?
- attribute 是 dom 元素在文檔中作為 html 標簽擁有的屬性;
- property 就是 dom 元素在 js 中作為對象擁有的屬性。
- 對于 html 的標準屬性來說, attribute 和 property 是同步的,是會自動更新的
- 但是對于自定義的屬性來說,他們是不同步的
45、談談你對ES6的理解
- 新增模板字符串(為 JavaScript 提供了簡單的字符串插值功能)
- 箭頭函數
- for-of (用來遍歷數據—例如數組中的值。)
- arguments 對象可被不定參數和默認參數完美代替。
- ES6 將p romise 對象納入規范,提供了原生的 Promise 對象。
- 增加了 let 和 const 命令,用來聲明變量。
- 增加了塊級作用域。
- let 命令實際上就增加了塊級作用域。
- 還有就是引入 module 模塊的概念
$編程題
1、寫一個通用的事件偵聽器函數
// event(事件)工具集,來源:github.com/markyun markyun.Event = {
// 視能力分別使用dom0||dom2||IE方式 來綁定事件 // 參數: 操作的元素,事件名稱 ,事件處理程序 addEvent : function(element, type, handler){ if (element.addEventListener) { //事件類型、需要執行的函數、是否捕捉 element.addEventListener(type, handler, false); } else if (element.attachEvent) { element.attachEvent('on' + type, function(){ handler.call(element); }); } else { element['on' + type] = handler; } }, // 移除事件 removeEvent : function(element, type, handler){ if (element.removeEventListener) { element.removeEventListener(type, handler, false); } else if (element.datachEvent) { element.detachEvent('on' + type, handler); } else { element['on' + type] = null; } }, // 阻止事件 (主要是事件冒泡,因為IE不支持事件捕獲) stopPropagation : function(ev){ if (ev.stopPropagation) { ev.stopPropagation(); } else { ev.cancelBubble = true; } }, // 取消事件的默認行為 preventDefault : function(event){ if (event.preventDefault) { event.preventDefault(); } else { event.returnValue = false; } }, // 獲取事件目標 getTarget : function(event){ return event.target || event.srcElement; }
</pre>
2、如何判斷一個對象是否為數組
functionisArray(arg){ if (typeof arg === 'object') { return Object.prototype.toString.call(arg) === '[object Array]'; } return false; }
3、冒泡排序
- 每次比較相鄰的兩個數,如果后一個比前一個小,換位置
var arr = [3, 1, 4, 6, 5, 7, 2];
functionbubbleSort(arr){ for (var i = 0; i < arr.length - 1; i++) { for(var j = 0; j < arr.length - 1; j++) { if(arr[j + 1] < arr[j]) { var temp; temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } return arr; }
console.log(bubbleSort(arr)); </pre>
4、快速排序
- 采用二分法,取出中間數,數組每次和中間數比較,小的放到左邊,大的放到右邊
var arr = [3, 1, 4, 6, 5, 7, 2];
functionquickSort(arr){ if(arr.length == 0) { return []; // 返回空數組 }
var cIndex = Math.floor(arr.length / 2); var c = arr.splice(cIndex, 1); var l = []; var r = []; for (var i = 0; i < arr.length; i++) { if(arr[i] < c) { l.push(arr[i]); } else { r.push(arr[i]); } } return quickSort(l).concat(c, quickSort(r));
}
console.log(quickSort(arr)); </pre>
5、編寫一個方法 求一個字符串的字節長度
- 假設:一個英文字符占用一個字節,一個中文字符占用兩個字節
functionGetBytes(str){
var len = str.length; var bytes = len; for(var i=0; i<len; i++){ if (str.charCodeAt(i) > 255) bytes++; } return bytes; }
alert(GetBytes("你好,as")); </pre>
$其他
1、談談你對重構的理解
- 網站重構:在不改變外部行為的前提下,簡化結構、添加可讀性,而在網站前端保持一致的行為。也就是說是在不改變UI的情況下,對網站進行優化, 在擴展的同時保持一致的UI
-
對于傳統的網站來說重構通常是:
-
表格( table )布局改為 DIV+CSS
-
使網站前端兼容于現代瀏覽器(針對于不合規范的 CSS 、如對IE6有效的)
-
對于移動平臺的優化
-
針對于 SEO 進行優化
2、什么樣的前端代碼是好的
- 高復用低耦合,這樣文件小,好維護,而且好擴展。
3、對前端工程師這個職位是怎么樣理解的?它的前景會怎么樣?
-
前端是最貼近用戶的程序員,比后端、數據庫、產品經理、運營、安全都近
- 實現界面交互
- 提升用戶體驗
- 有了Node.js,前端可以實現服務端的一些事情
-
前端是最貼近用戶的程序員,前端的能力就是能讓產品從 90分進化到 100 分,甚至更好,
</ul>
-
與團隊成員, UI 設計,產品經理的溝通;
-
做好的頁面結構,頁面重構和用戶體驗;
-
為簡化用戶使用提供技術支持(交互部分)
-
為多個瀏覽器兼容性提供支持
-
為提高用戶瀏覽速度(瀏覽器性能)提供支持
-
為跨平臺或者其他基于webkit或其他渲染引擎的應用提供支持
-
為展示數據提供支持(數據接口)
-
先期團隊必須確定好全局樣式( globe.css ),編碼模式( utf-8 ) 等;
-
編寫習慣必須一致(例如都是采用繼承式的寫法,單樣式都寫成一行);
-
標注樣式編寫人,各模塊都及時標注(標注關鍵樣式調用的地方);
-
頁面進行標注(例如 頁面 模塊 開始和結束);
-
CSS 跟 HTML 分文件夾并行存放,命名都得統一(例如 style.css );
-
JS 分文件夾存放 命名以該 JS 功能為準的英文翻譯。
-
圖片采用整合的 images.png png8 格式文件使用 - 盡量整合在一起使用方便將來的管理
- 面試完你還有什么問題要問的嗎
- 你有什么愛好?
- 你最大的優點和缺點是什么?
- 你為什么會選擇這個行業,職位?
- 你覺得你適合從事這個崗位嗎?
- 你有什么職業規劃?
- 你對工資有什么要求?
- 如何看待前端開發?
- 未來三到五年的規劃是怎樣的?
4、你覺得前端工程的價值體現在哪
5、平時如何管理你的項目?
人事面
來自:http://blog.poetries.top/2017/03/12/front-end-interview-summary/
-
XSS原理及防范
XSS防范方法
XSS與CSRF有什么區別嗎?
CSRF的防御
18、用過哪些設計模式?
15、談談你對webpack的看法
16、說說你對AMD和Commonjs的理解
17、常見web安全及防護原理
$JavaScript
1、閉包
6、display,float,position的關系
7、清除浮動的幾種方式,各自的優缺點
8、為什么要初始化CSS樣式?
9、css3有哪些新特性
CSS3新增偽類有那些?
10、display有哪些值?說明他們的作用
11、介紹一下標準的CSS的盒子模型?低版本IE的盒子模型有什么不同的?
12、CSS優先級算法如何計算?
13、對BFC規范的理解?
14、談談浮動和清除浮動
15、position的值, relative和absolute定位原點是
16、display:inline-block 什么時候不會顯示間隙?(攜程)
17、PNG,GIF,JPG的區別及如何選
2、 display: none; 與 visibility: hidden; 的區別
16、Doctype作用? 嚴格模式與混雜模式如何區分?它們有何意義?
17、行內元素有哪些?塊級元素有哪些? 空(void)元素有那些?行內元素和塊級元素有什么區別?
18、HTML全局屬性(global attribute)有哪些
$CSS部分
1、css sprite是什么,有什么優缺點
13、iframe有那些缺點?
14、WEB標準以及W3C標準是什么?
15、xhtml和html有什么區別?
10、 HTML5 的離線儲存怎么使用,工作原理能不能解釋一下?
7、語義化的理解
8、介紹一下你對瀏覽器內核的理解?
9、html5有哪些新特性、移除了那些元素?
4、從瀏覽器地址欄輸入url到顯示頁面的步驟
5、如何進行網站性能優化
6、HTTP狀態碼及其含義