任務16-JS 語法

問答:

1. CSS和JS在網頁中的放置順序是怎樣的?

CSS一般放置在的<head>標簽中。網頁渲染時,先解析HTML標簽,構建DOM樹,再解析CSS標簽,構建CSSOM樹,然后把DOM和CSSOM組合成渲染樹。如果把CSS放置在底部,那么頁面加載的時候可能會出現白屏或者無樣式內容閃爍(FOUC)。
JS一般放置body標簽的最后面。JS會阻塞加載的,如果放在前面,會影響頁面加載的速度,如果JS文件比較大,算法也比較復雜的話,影響更大。

2. 解釋白屏和FOUC

白屏和無樣式內容閃爍(FOUC)是由于不用瀏覽器加載顯示頁面的機制不同造成的。當把CSS樣式放在底部或者使用@import方式引入樣式時,一些瀏覽器例如chrome,它的加載和渲染機制是等CSS全部加載解析完成后再渲染展示頁面,而這個等待的時間就是白屏。另外一些瀏覽器,如Firefox,它會在CSS未加載前展示頁面,等CSS加載后再重新繪一次,這就造成了FOUC(無樣式內容閃爍)。如果把JS文件放在頭部,腳本會阻塞后面內容的展示和其后組件的下載,也會導致白屏現象。

3. async和defer的作用是什么?有什么區別。

當瀏覽器遇到script腳本的時候:

  • 沒有defer和async時,<script src="script.js"></script>,瀏覽器會立即加載并執行指定的腳本,“立即”指的是在渲染該script標簽之下的文檔元素之前,也就是說不等待后續載入的文檔元素,讀到就加載并執行。
  • 有async,<script async src="script.js"></script>,加載和渲染后續文檔元素的過程將和script.js的加載與執行并行進行(異步)。
  • 有defer<script defer src="script.js"></script>,加載后續文檔元素的過程將和script.js的加載并行進行(異步),但script.js的執行要在所有元素解析完成之后,DOMContentLoaded事件觸發之前完成。
    defer和async

藍色線代表網絡讀取,紅色線代表執行時間,這倆都是針對腳本的;綠色線代表 HTML 解析。
此圖告訴我們以下幾個要點:
a. defer 和 async 在網絡讀取(下載)這塊兒是一樣的,都是異步的(相較于 HTML 解析)
b. 它倆的差別在于腳本下載完之后何時執行,顯然defer 是最接近我們對于應用腳本加載和執行的要求的
c. 關于 defer,此圖未盡之處在于它是按照加載順序執行腳本的,這一點要善加利用
d. async 則是一個亂序執行的主,反正對它來說腳本的加載和執行是緊緊挨著的,所以不管你聲明的順序如何,只要它加載完了就會立刻執行
e. 仔細想想,async 對于應用腳本的用處不大,因為它完全不考慮依賴(哪怕是最低級的順序執行),不過它對于那些可以不依賴任何腳本或不被任何腳本依賴的腳本來說卻是非常合適的,最典型的例子:Google Analytics

4. 簡述網頁的渲染機制?

  • Create/Update DOM And request css/image/js:瀏覽器請求到HTML代碼后,在生成DOM的最開始階段(應該是Bytes → characters后),并行發起css、圖片、js的請求,無論他們是否在HEAD里。
    注意:發起js文件的下載request并不需要DOM處理那個script節點。比如:簡單的正則匹配就能做到這一點,雖然實際上并不一定是通過正則。這是很多人在理解渲染機制的時候存在的誤區。
  • Create/Update Render CSSOM:CSS文件下載完成,開始構建CSSOM。
  • Create/Update Render Tree:所有CSS文件下載完成,CSSOM構建結束后,和DOM一起生成Render Tree。
  • Layout:有了Render Tree,瀏覽器已經能知道網頁中有哪些節點、各個節點的CSS定義以及他們的從屬關系。下一步操作稱之為layout,顧名思義就是計算出每個節點在屏幕中的位置。
  • Painting:Layout之后,瀏覽器已經知道了哪些節點要顯示(which nodes are visible)、么個節點的CSS屬性是什么(their computed style)、每個節點在屏幕中的位置是哪里(geometry)。就進入了最后一步:Painting,按照算出來的規則,通過顯卡,把內容畫到屏幕上。
    以上五個步驟前3個步驟之所有使用 “Create/Update” 是因為DOM、CSSOM、Render Tree都可能在第一次Painting后又被更新多次,比如JS修改了DOM或者CSS屬性。
    Layout 和 Painting 也會被重復執行,除了DOM、CSSOM更新的原因外,圖片下載完成后也需要調用Layout 和 Painting來更新網頁。
DOM 和 CSSOM 合并后生成 Render Tree

5. JavaScript 定義了幾種數據類型? 哪些是簡單類型?哪些是復雜類型?

JavaScript語言的每一個值,都屬于某一種數據類型。JavaScript的數據類型,共有六種:

  • 數值(number):整數和小數(比如1和3.14)
  • 字符串(string):字符組成的文本(比如“Hello World”)
  • 布爾值(boolean):true(真)和false(假)兩個特定值
  • undefined:表示“未定義”或不存在,即此處目標沒有任何值
  • null:表示空缺,即此處應該由一個值,但目前為空
  • object:是一種復雜的數據類型,表示各種值組成的集合

6. NaN、undefined、null分別代表什么?

  • NaN:非數字值的特殊值。該屬性用于指示某個值不是數字。可以把Number對象設置為該值,來指示不是數字值。這個數值用于表示一個本來要返回數值的操作數未返回數值的情況(這樣就不會拋出錯誤)。注意:NaN與其他數值進行比較的結果總是不相等的,包括它自身在內。

  • undefined:表示不存在值,就是此處目前不存在任何值。典型用法是:

    • 變量被聲明了,但沒有賦值時,就等于undefined。
    • 調用函數時,應該提供的參數沒有提供,該參數等于undefined。
    • 對象沒有賦值的屬性,該屬性的值為undefined。
    • 函數沒有返回值時,默認返回undefined。
  • null:表示空值,即該出的值現在為空。典型用法是:

    • 作為函數的參數,表示該函數的參數是一個沒有任何內容的對象。
    • 作為對象原型鏈的終點。

7. typeof和instanceof的作用和區別?

  • typeof:可以用來確定一個變量的數據類型,用來返回操作數類型的字符串。它所返回的結果一般有:布爾:boolean、數字:number、字符串:string、函數:function和undefined:undefined,除此之外,其他情況都返回object。
  • instanceof:可以用來確定一個引用類型值是什么類型的對象。instanceof 左操作數是一個類,右操作數是標識對象的類。如果左側的對象是右側類的實例,則返回true。而js中對象的類是通過初始化它們的構造函數來定義的。即instanceof的右操作數應當是一個函數。所有的對象都是object的實例。如果左操作數不是對象,則返回false,如果右操作數不是函數,則拋出typeError。instanceof 運算符是用來測試一個對象是否在其原型鏈原型構造函數的屬性。其語法是object instanceof constructor。instanceof 操作符用來比較兩個操作數的構造函數。只有在比較自定義的對象時才有意義。 如果用來比較內置類型,將會和 typeof 操作符 一樣用處不大。

代碼:

1. 完成如下代碼判斷一個變量是否是數字、字符串、布爾、函數 (難度*)

<pre>
function isNumber(el){
if(typeof el=="number"){
return true;
}
else{
return false;
}
}
function isString(el){
if(typeof el=="string"){
return true;
}
else{
return false;
}
}
function isBoolean(el){
if(typeof el=="boolean"){
return true;
}
else{
return false;
}
}
function isFunction(el){
if(typeof el=="function"){
return true;
}
else{
return false;
}
}

  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

</pre>

2. 以下代碼的輸出結果是?(難度**)

<pre>
console.log(1+1); //2,兩個數相加,輸出數值;
console.log("2"+"4"); //24,兩個字符串相加,輸出字符串;
console.log(2+"4"); //24,一個數值和一個字符串相加,輸出字符串;
console.log(+new Date());//1474425015234,用new Date()參與計算會自動轉換成從1970.1.1到現在的時間的毫秒數;
console.log(+"4");//4,只有一個字符串,會試著將其轉換成數字;
</pre>

3. 以下代碼的輸出結果是? (難度***)

<pre>
var a = 1;
a+++a;//3;a++的運算級高,即(a++)+a;

typeof a+2;//number2;typeof的運算級,先得出typeof a結果是number,再+2,完成一個字符串的拼接;
</pre>

4. 遍歷數組,把數組里的打印數組每一項的平方 (難度**)

<pre>
var arr = [3,4,5]
for(var i = 0; i < arr.length; i++){
console.log(arr[i]*arr[i]);
}// 輸出 9, 16, 25
</pre>

5. 遍歷 JSON, 打印里面的值 (難度**)

<pre>

var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for (var i in obj) {
console.log(i + ':' +obj[i]);
}// 輸出 name: hunger, sex: male, age:28
</pre>

6. 下面代碼的輸出是? 為什么 (難度***)

<pre>
console.log(a);//undefined;變量a已經被聲明,但是由于變量提升,其值是初始值undefined
var a = 1;//1;a被賦值為1;
console.log(a);//1;a在此之前已經被賦值為1;
console.log(b);//報錯;變量b沒有被定義;
</pre>

本文版權歸本人及饑人谷所有,轉載請注明出處

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內容

  • 學習內容:JavaScript基本概念,基礎數據類型,運算符,流程控制語句 一、CSS和JS在網頁中的放置順序是怎...
    鴻鵠飛天閱讀 512評論 0 0
  • 1.CSS和JS在網頁中的放置順序是怎樣的?為什么會出現白屏和FOUC? 在寫HTML代碼時,我們都是將CSS文件...
    26d608950683閱讀 642評論 0 0
  • 1. CSS和JS在網頁中的放置順序是怎樣的? css放在head標簽里 js放在body標簽的最后主要是為了避免...
    mint9602閱讀 352評論 0 0
  • 1.CSS和JS在網頁中的放置順序是怎樣的? 一般而言,CSS放置在網頁文檔的頭部,JS放置在網頁文檔的后面,CS...
    GarenWang閱讀 484評論 0 0
  • 問答題 CSS和JS在網頁中的放置順序是怎樣的?答:css:通過link標簽將樣式表放在 中。js:放在 中尾部。...
    饑人谷_桶飯閱讀 292評論 0 0