1. CSS和JS在網(wǎng)頁中的放置順序是怎樣的?
csss:通過link標(biāo)簽將樣式表放在頂部(head中)讨衣。
js:通過link標(biāo)簽引入或者是<script>標(biāo)簽吏奸,通常放在底部(body的最后)。如果把js文件放在head中浓领,瀏覽器必須等到全部JavaScript代碼都被下載玉凯、解析和執(zhí)行完成以后,才能開始呈現(xiàn)頁面的內(nèi)容联贩。對于那些需要很多JavaScript代碼的頁面來說漫仆,這無疑會導(dǎo)致瀏覽器在呈現(xiàn)頁面時出現(xiàn)明顯的延遲,而延遲期間的瀏覽器窗口中將是一片空白泪幌。所以為了避免這個問題盲厌,提高用戶的使用舒適度,現(xiàn)在Web應(yīng)用程序一般都全部JavaScript引用放在body元素中頁面的內(nèi)容后面祸泪。
2. 解釋白屏和FOUC
白屏問題:如果把css放在底部吗浩,加載外置樣式文件的時候,屏幕上沒有內(nèi)容浴滴,一片空白拓萌,加載完CSS之后才開始繪制頁面。如果使用@import升略,即使放在頭部微王,也可能出現(xiàn)白屏屡限,不建議使用。
FOUC: (Flash of Unstyled Content) 無樣式內(nèi)容閃爍炕倘。如果把樣式放在底部,對于IE瀏覽器,在某些場景下(點(diǎn)擊鏈接,輸入U(xiǎn)RL,使用書簽進(jìn)入等),會出現(xiàn) FOUC 現(xiàn)象(逐步加載無樣式的內(nèi)容,等CSS加載后頁面突然展現(xiàn)樣式).對于 Firefox 會一直表現(xiàn)出 FOUC .
3. async和defer的作用是什么钧大?有什么區(qū)別
async和defer的作用是實(shí)現(xiàn)加載異步。
async:<script async src="script.js"></script>有 async罩旋,加載和渲染后續(xù)文檔元素的過程將和 script.js 的加載與執(zhí)行并行進(jìn)行(異步)啊央,但不保證按照代碼的先后順序執(zhí)行,如后面的較小的文件下載完之后立即執(zhí)行涨醋,可能導(dǎo)致順序錯亂瓜饥。
defer:<script defer src="script.js"></script>有 defer,腳本會被延遲到整個頁面都解析完畢后再運(yùn)行浴骂。因此乓土,如果script元素中設(shè)置了defer屬性,相當(dāng)于告訴瀏覽器立即下載溯警,但延遲執(zhí)行趣苏。(有順序)
4. 簡述網(wǎng)頁的渲染機(jī)制
解析 HTML 標(biāo)簽, 構(gòu)建 DOM 樹
解析 CSS 標(biāo)簽, 構(gòu)建 CSSOM 樹
把 DOM 和 CSSOM 組合成 渲染樹 (render tree)
在渲染樹的基礎(chǔ)上進(jìn)行布局, 計(jì)算每個節(jié)點(diǎn)的幾何結(jié)構(gòu)
把每個節(jié)點(diǎn)繪制到屏幕上 (painting)
5. JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是簡單類型?哪些是復(fù)雜類型?
JavaScript定義了六種數(shù)據(jù)類型。分別是:
數(shù)值(number):整數(shù)和小數(shù)(比如1和3.14)
字符串(string):字符組成的文本(比如"Hello World")
布爾值(boolean):true(真)和false(假)兩個特定值
undefined:表示“未定義”或不存在梯轻,即此處目前沒有任何值
null:表示空缺食磕,即此處應(yīng)該有一個值,但目前為空
對象(object):各種值組成的集合
除了最后一個對象object是復(fù)雜類型喳挑,其余都是簡單類型彬伦。一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器伊诵。對象又分為三個子類型:狹義的對象(object)媚朦、數(shù)組(array)、函數(shù)(function)日戈。
6. NaN询张、undefined、null分別代表什么?
NAN:NOT A NUMBER,表示非數(shù)字.數(shù)字轉(zhuǎn)換時如果第一個字符不是_或者數(shù)字就會返回NAN浙炼。
null表示空值份氧,即該處的值現(xiàn)在為空。
undefined表示不存在值弯屈,就是此處目前不存在任何值蜗帜。
typeof undefined 返回"undefined"
typeof null 返回"object"
7. typeof和instanceof的作用和區(qū)別?
- typeof運(yùn)算符可以返回一個值的數(shù)據(jù)類型,可以使用typeof檢查一個變量是否存在,不會報(bào)錯资厉。
v
> Uncaught ReferenceError: v is not defined(…)
typeof v
> "undefined" - instanceof 用于判斷一個變量是否某個對象的實(shí)例.
代碼
判斷一個變量是否是數(shù)字厅缺、字符串、布爾、函數(shù)
function isNumber(e1){
return typeof(e1) === 'number';
}
function isString(e1){
return typeof(e1) === 'string';
}
function isBoolean(e1){
return typeof(e1) === 'boolean';
}
function isFunction(e1){
return typeof(e1) === 'function';
}
var a=2,
b='jirengu',
c=false;
alert(isNumber(a));//true
alert( isString(a) ); //false
alert( isString(b) ); //true
alert( isBoolean(c) ); //true
alert( isFunction(a)); //false
alert( isFunction( isNumber ) ); //true
以下代碼的輸出結(jié)果是?
console.log(1+1); //輸出2湘捎,兩個都是數(shù)字诀豁,做加法運(yùn)算
console.log("2"+"4"); //輸出24,兩個都是字符串做字符串拼接
console.log(2+"4"); //輸出24窥妇,一個參數(shù)是數(shù)字一個參數(shù)是字符串舷胜,將數(shù)字轉(zhuǎn)換成字符串然后拼接
console.log(+new Date());//輸出1479097022325
console.log(+"4");//輸出4,只有一個字符串參數(shù)會嘗試將其轉(zhuǎn)換成數(shù)字輸出活翩。
以下代碼的輸出結(jié)果是烹骨?
var a = 1;
a+++a;//輸出3. 后置遞增運(yùn)算符優(yōu)先級比加法運(yùn)算符高,此代碼相當(dāng)于(a++)+a材泄,a++是先賦予a的值1沮焕,然后a在加1,a變成了2拉宗,所以結(jié)果是1+2=3.
typeof a+2;//輸出"number2"遇汞。typeof優(yōu)先級比加法高,所以相當(dāng)于(typeof a)+2簿废,typeof a輸出值為number”,字符串與數(shù)字相加會將數(shù)字轉(zhuǎn)換為字符串然后拼接络它。所以結(jié)果為“number2”.
6.下面代碼的輸出是? 為什么
console.log(a);
var a = 1;
console.log(a);
console.log(b);
//js的工作方式是族檬,先解析代碼,獲取所有被聲明的變量化戳,把變量聲明語句提升到頭部单料,然后再一行一行執(zhí) 行。相當(dāng)于代碼變成:
var a;
console.log(a);//由于此時a還沒有賦值点楼,所以輸出undefined扫尖。
a = 1;
console.log(a); //a已經(jīng)賦值,輸出1.
console.log(b); //b沒有被定義掠廓,報(bào)錯换怖。