1.CSS和JS在網(wǎng)頁中的放置順序是怎樣的洪己?
- 一般而言妥凳,CSS放置在網(wǎng)頁文檔的頭部,JS放置在網(wǎng)頁文檔的后面答捕,CSS放在文檔的頭部逝钥,能夠確保用戶更早的看到頁面,提高用戶體驗(yàn),但缺陷是若放置的CSS文件過多艘款,過大持际,會(huì)延長屏幕的白屏?xí)r間,同時(shí)也有時(shí)引入插件哗咆,也需要把JS放在頭部蜘欲,如Jquery的引入,一般放在頭部晌柬,因?yàn)楹竺娴腏S代碼依賴于jquery.
- 原因是由于瀏覽器的解析方式是自上而下的加載html文檔姥份,CSS是并行加載,而JS是阻塞加載年碘,會(huì)影響頁面的加載速度澈歉,如果JS的文件較大,很容易出現(xiàn)FOCU的現(xiàn)象屿衅,并且JS還有可能修改DOM埃难,JS的執(zhí)行可能依賴于最新的樣式,這樣需要保證在JS代碼執(zhí)行前必須所有的CSS樣式加載和解析完畢涤久。
- 綜上涡尘,CSS和JS的放置順尋根本目的是為了提高頁面的加載速度,所以必要的CSS和JS放置在頭部响迂,把不重要的CSS和js放在底部考抄。
- 一般放置方式,如圖:
![1%B(5Q5]F1W42EZV(IS4H{O.png](http://upload-images.jianshu.io/upload_images/3361706-29f43a7a55b85de3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) -
引用jQuery等庫時(shí):
2.解釋白屏和FOUC
- 白屏與無樣式內(nèi)容閃爍(FOUC)是因?yàn)椴煌瑸g覽器加載與顯示頁面的機(jī)制不同而造成的
- 白屏:如果把樣式放在底部,對(duì)于IE瀏覽器,在某些場(chǎng)景下(新窗口打開,刷新等)頁面會(huì)出現(xiàn)白屏,而不是內(nèi)容逐步展現(xiàn)如果使用 @import標(biāo)簽,即使 CSS 放入 link, 并且放在頭部,也可能出現(xiàn)白屏。這是由于優(yōu)先解析@import標(biāo)簽的文件少态,若文件過大,過大,就會(huì)導(dǎo)致加載時(shí)間過長严蓖,產(chǎn)生白屏。
- FOUC:全稱無樣式閃爍活玲,把樣式放在頁面底部瞒津,IE瀏覽器下點(diǎn)擊點(diǎn)擊鏈接會(huì)出現(xiàn)FOUC現(xiàn)象,F(xiàn)irfox會(huì)一直白屏来氧。一種情況是由于將JS放在底部诫给,會(huì)阻塞后面內(nèi)容的呈現(xiàn)和其后組件的下載,產(chǎn)生FOUC現(xiàn)象啦扬;
3.async和defer的作用是什么中狂?有什么區(qū)別
- 一般情況下JS文件沒有async和defer,會(huì)立即加載文件并解析扑毡,不扥帶后面的文件的加載胃榕,即讀到就執(zhí)行,有了async和defer可以實(shí)現(xiàn)異步加載瞄摊, async加載和渲染后續(xù)文檔元素的過程將和 script.js 的加載與執(zhí)行并行進(jìn)行(異步)勋又, defer加載后續(xù)文檔元素的過程將和 script.js 的加載并行進(jìn)行(異步)苦掘,但 script.js 的執(zhí)行要在所有元素解析完成之后,DOMContentLoaded 事件觸發(fā)之前完成楔壤,最終目的提高頁面的加載速度和流暢性鹤啡。使用方式如下:
<script async src="app.js></script>
,<script defer src="app.js></script>
- 二者的區(qū)別是,defer的JS文件延遲到文檔解析和顯示有先后順序蹲嚣,async不保證順序递瑰。
4.網(wǎng)頁的渲染機(jī)制
- 解析 HTML 標(biāo)簽, 構(gòu)建 DOM 樹
- 解析 CSS 標(biāo)簽, 構(gòu)建 CSSOM 樹
- 把 DOM 和 CSSOM 組合成 渲染樹 (render tree)
- 在渲染樹的基礎(chǔ)上進(jìn)行布局, 計(jì)算每個(gè)節(jié)點(diǎn)的幾何結(jié)構(gòu)
- 把每個(gè)節(jié)點(diǎn)繪制到屏幕上 (painting)
- 渲染機(jī)制圖:
![VA4BMG]D4O]@GLMI`K0W5.png](http://upload-images.jianshu.io/upload_images/3361706-f118a4320e6d5c10.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
5.JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是簡單類型?哪些是復(fù)雜類型?
- 數(shù)據(jù)類型有6種
- 簡單類型5種,null, undefined,boolean,string,number
- 復(fù)雜類型1種隙畜,object
- 簡單類型中抖部,undefined指的是變量未被賦值時(shí),表示“未定義”或不存在禾蚕,即此處目前沒有任何值您朽,會(huì)出現(xiàn)undefined,null是空值,不等同于undefined换淆,空值表示空缺哗总,即此處應(yīng)該有一個(gè)值,但目前為空倍试,而undefined只是沒有賦值讯屈,不存在,所以二者不同
- boolean县习,即布爾邏輯值涮母,就是經(jīng)常可見的false和true
- number ,即數(shù)字躁愿,如1,2,3
- string叛本,字符串,如“hello world”
- object彤钟,對(duì)象来候,如“ var obj={name:"小明",age:10}”
6.NaN、undefined逸雹、null分別代表什么?
- NaN含義是Not a Number营搅,表示非數(shù)字,NaN和任何值都不相等梆砸,包括自己转质,undefined:表示“未定義”或不存在,即此處目前沒有任何值帖世,null:表示空缺休蟹,即此處應(yīng)該有一個(gè)值,但目前為空,
- 類型不同鸡挠,NaN是一中number類型辉饱,null屬于特殊的object,undefinded屬于undefined類型
- 進(jìn)行比較運(yùn)算時(shí)拣展,非嚴(yán)格相等情況下:undefined==null,NaN與任何值都不相等彭沼,與自己也不相等。
7.typeof和instanceof的作用和區(qū)別?
- typeof 運(yùn)算符可以返回一個(gè)值的數(shù)據(jù)類型,,可以是任意類型备埃,如
type 100 //"number"
- instanceof運(yùn)算符:此運(yùn)算符可以判斷一個(gè)變量是否是某個(gè)對(duì)象(類)的實(shí)例姓惑,返回值是布爾類型的,如
var str=new String("hello");console.log(str instanceof String)
代碼輸出的結(jié)果為true,因?yàn)閟tr是對(duì)象String的對(duì)象實(shí)例。一般說來只有使用構(gòu)造函數(shù)創(chuàng)建的對(duì)象才會(huì)返回true按脚,否則返回false于毙,不過數(shù)組是一個(gè)例外,都會(huì)返回true.