HTML
什麼是標籤語義化
合適的標籤做合適的事情
標籤語義化的好處
- 比如標題使用
h1-h6
,能夠增加權重,有利於蜘蛛的抓取,有利於SEO的優化 - 去掉樣式的時候,頁面結構仍然比較清晰
- 便於團隊的開發和維護
link和@import的區別
- link是屬於XHTML標籤,除了加載CSS之外,還可以用於定義RSS等其他事務;@import屬於CSS範疇,只能加載CSS
- link引用CSS的時候,在
頁面載入時加載
;@import在頁面完全載入以後才加載
- link是XHTML標籤沒有兼容問題;@import是在CSS2.1時提出來的,低版本的瀏覽器不支持
- link支持使用JavaScript控制DOM來改變樣式;而@import不支持
XHTML和HTML的區別
XHTML可以說是HTML的子集,XHTML是更加嚴格的HTML。在XHTML中嚴格要求:
- 所有的標籤必須是閉合的
- 所有的標籤必須小寫
- 所有的屬性值必須要用引號引起來(
""
,遵循w3c的規範,如果不加雙引號,就無法區分是一些特殊字符了。)
列舉常見的行內元素、塊級元素和空元素
- 行內元素:
a span img input select b
- 塊級元素:
div ul li ol p h1-h6
- 空元素(指的是沒有內容的元素):
link input meta br hr
談談你對瀏覽器內核的理解
瀏覽器內核主要由兩部分組成:渲染引擎
JS引擎
- 渲染引擎:負責取得網頁的內容(html、xml、css、img等)以及計算網頁的的顯示方式,然後輸出至顯示器或者打印機。不同瀏覽器的內核也不盡相同,所以在不同的瀏覽器可能會渲染出不同的效果。
- JS引擎:解析、執行JavaScript來展示網頁的動態效果
開始渲染引擎和JS引擎並沒有區分的很明確,後來JS引擎越來越獨立,內核就傾向與只指渲染引擎
。
JavaScript
爲什麼typeof = null 的結果爲"object"
不同的對象在底層都表示爲二進制,在JavaScript中二進制前三位都爲0的話會被判定爲object類型,而null的二進制全部爲0,前三位也爲0,所以執行typeof檢測的時候返回的結果爲object。
call、apply、bind的區別以及應用場景?
不同點:call 和apply語法如下:
- 把需要操作函數中的this變爲第一個實參值,(在非嚴格模式下),第一個實參爲空或者寫null或者undefined,this都是window,剩下的第一個實參是誰,this就是誰。
(嚴格模式下)第一個實參爲空,this是undefined,其餘的寫誰this就是誰。 - 改變爲this後,把需要操作的函數執行。
唯一的區別:call在給函數傳遞實參的時候是一個個傳遞的,而apply是放在一個數組中一起傳遞的(但是也相當於一個個傳參)
bind的語法和call一樣,但是作用不一樣,bind只是提前把函數中的this改變了,但是並沒有立即把函數執行,它屬於預先改變this(柯里理化思想)
共同點:都屬於Function上定義的三種方法,所有的函數數據類型值都可以調取這三種方法,都是用來改變一個函數中的this關鍵字指向的(bind不兼容ie6-8)其餘的兼容所有的瀏覽器。
箭頭函數和普通函數的區別?
- 箭頭函數是匿名函數不能作爲構造函數,不能使用new方法來創建
- 箭頭函數不綁定arguments,取而代之用rest參數…解決
- 箭頭函數沒有原型屬性
- 箭頭函數不能換行
- 箭頭函數中的this和普通函數的this指向存在着差別
- 箭頭函數中的this不能使用call、apply、bind來改變
[].map(function(){})和[].forEach(function(){})的區別?
1 forEach()爲數組中的每一項執行回調函數,不像map(),他總是返回undefined的值,並且不可以被鏈式調用。
2. forEach遍歷的範圍在第一次調用callBack前就會確定。調用forEach後添加到數組中的項是不會被訪問到。
3. 使用forEach循環的時候是不能跳出循環的(中途不能被打斷),但是我們可以通過return控制循環,然而for循環我們可以通過break或者continue來控制循環是否執行
map()同樣爲數組中的每一項執行回調函數,並進行相應的處理,返回一個新的數組,原來的數組不會發生變化。
iframe有哪些優缺點?
缺點:
- 在網頁中使用框架架構最大的弊病就是搜索引擎的‘蜘蛛’程序無法解讀這個頁面,
不利於SEO的優化
。當‘蜘蛛’程序遇到由無數的框架組成的頁面時,它們只會看到框架而無法找到鏈接,因此他們以爲改網站是個死站。對於一個網站來說無異於一場災難。 - 框架結構有時候會使人感到迷惑,特別是在幾個框架中都出現上下左右的滾動條的時候,
不利於審美
。 不利於打印
瀏覽器的後退按鈕無效
- 多框架頁面會增加http請求,造成網頁加載速度慢
- 在手機或者小屏顯示器上達不到良好的展示
優點:
- 提高了代碼的重用性
- 重載頁面時不需要重載整個頁面,只需要重載頁面中的一個框架頁(減少了數據的傳輸,加快了網頁下載速度)
ES6
Object .is() 與原來的比較操作符 === 和 == 的區別?
== 相等運算符,比較時會自動進行數據類型轉換
=== 嚴格相等運算符,比較時不進行隱式類型轉換
Object .is() 同值相等算法,在 === 基礎上對 0 和 NaN 特別處理
+0 === -0 //true
NaN === NaN // false
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
其他
localforage和localStorage用來本地存儲數據的的卻別
localStorage的缺點:
存儲容量限制
,大部分瀏覽器應該最多5M
。我就遇到過localStorage存儲字符然後尺寸爆掉的情況。僅支持字符串
,如果是存對象還需要將使用JSON.stringify和JSON.parse方法互相轉換,有些囉嗦。讀取都是同步的
。大多數情況下,還挺好使的。但,如果存儲數據比較大,例如一張重要圖片base64格式存儲了,再讀可能會有可感知的延遲時間。
localforage的作用就是用來規避上面localStorage的缺點,同時保留localStorage的優點而設計的。從命名上就可以看出兩者關係不淺。
localStorage的優點是API非常簡單,使用很方便。於是,localforage和localStorage一模一樣。
至於localStorage的不足,localforage和使用了其他HTML5 API進行規避,什麼API呢?是IndexedDB和WebSQL。
也就是說,localforage的邏輯是這樣的:優先使用IndexedDB存儲數據,如果瀏覽器不支持,使用WebSQL,瀏覽器再不支持,使用localStorage
。
然後API還是localStorage的API,也就是數據增刪改查通過get,set,remove,clear和length等API。
所以在項目中,我們一般通過npm安裝這個庫來進行本地存儲。
堆、棧、隊列之間的區別?
- 堆是在程序運行時而不是在程序編譯時,申請的某個大小的內存空間。即動態分配內存,對其訪問和對一般內存的訪問沒有區別
- 棧就是一個桶,後放進去的先拿出來,它後面本來有的東西要等它出來之後才能出來(後進先出)
- 隊列是只能在隊頭做刪除操作,在隊尾做插入操作,而棧只能在棧頂做插入和刪除操作。
基於 Token 的身份驗證方法
- 客戶端通過用戶名+密碼等方式請求登錄
- 服務端收到請求,驗證賬號、密碼是否正確
- 驗證成功後服務端會簽發一個token,將這個token以及請求的數據返回給客戶端
- 客戶端收到token之後可以把它存儲起來,存在cookie或者localStorage中
- 客戶端每次請求資源的時候,都需要呆着服務端簽發的token
- 服務端收到請求,然後去驗證客戶端請求裏面帶着的 Token,如果驗證成功,就向客戶端返回請求的數據
什麼是svg,什麼用處?
SVG 是一種基於 XML 語法的圖像格式,全稱是可縮放矢量圖(Scalable Vector Graphics)
。其他圖像格式都是基於像素處理的,SVG 則是屬於對圖像的形狀描述,所以它本質上是文本文件,體積較小,且不管放大多少倍都不會失真。
與其他圖像格式相比,使用 SVG 的優勢在於:
- SVG 可被非常多的工具讀取和修改(比如記事本)
- SVG 與 JPEG 和 GIF 圖像比起來,尺寸更小,且可壓縮性更強。
- SVG 是可伸縮的
- SVG 圖像可在任何的分辨率下被高質量地打印
- SVG 可在圖像質量不下降的情況下被放大
- SVG 圖像中的文本是可選的,同時也是可搜索的(很適合製作地圖)
- SVG 可以與 Java 技術一起運行
- SVG 是開放的標準
- SVG 文件是純粹的 XML
主要用途:用來繪製圖形的。