JS筆試記錄(一)【基本類型與類型轉換/字符串與數字的加減/全局的對象/頁面生命週期】

基本類型與類型轉換

  • 六個原始類型(primitive type):String、Number、Boolean、Undefined、Null、Symbol(ES6新增);複雜數據類型Object 是元類型的擴展、有數組Array、Function。
    • 簡單數據類型把數據名和值直接存儲在棧當中。可以用typeof運算來檢測。但是typeof null返回object。
    • 複雜數據類型在棧中存儲數據名和一個指針,指針指向該變量在堆中的地址,在堆中存儲屬性及值。訪問時先從棧獲取地址,再到堆中拿出相應的值。
  • 簡單數據類型作爲參數時,函數內部對參數值的修改不會改變外部變量的值,相當於值傳遞。被傳遞進去的複雜類型則會被改變。因爲複雜數據類型的傳遞是把棧中對象的指針賦給變量,函數內外兩個變量都指向同一個堆中的對象,所以函數內部的對象發生改變,外部的變量也會相應的改變。
  • ==會在兩邊發生類型的轉換。undefined、null、空字符串、數字0、數字NAN在==是會被轉換成bool類型fasle
    • [] ,{}和null:{}是一個不完全空對象,原型鏈上有Object。[]原型鏈上還直接指向array,最底層是Object。null是完全空對象,沒有原型鏈。因此 [] {} 都會被轉爲true。 但是""就是false。
    • undefined == null,結果是true。且它倆與所有其他值比較的結果都是false。
    • NaN == NaN 爲false。
    • 元類型的==都是轉換成Number再比較的,引用類型都是轉換成元類型(具體通過valueOf和toString方法),再轉換成Number比較的。
    • 注意:[1,2,3].splice(1,1,1) == [2]的值爲假,因爲雖然左表達式的結果是[2],但是這兩個[2]指向的不是同一個地址,所以不一樣。

https://zhuanlan.zhihu.com/p/21650547


變量提升

這個我自己之前也寫過,就在那邊補充了。
但是要注意到底是變量提升還是作用域鏈的問題,如題:
js搜索變量是從內部順原型鏈往外部找的,內部直接找到了name,就不去外部了,執行第一次if時還沒初始化值,所以爲undefined,然後賦值執行console結束。

var name="World!";
(function(){	
		var name;	
		if(typeof name=== 'undefined'){
			name='Jack';
			console.log('Goodbye'+name);
		}
		else{
		console.log('hello'+name);	
		}	
	}	
)();

js的繼承

最基本的JavaScript實現繼承共6種方式:
原型鏈繼承、借用構造函數繼承、組合繼承、原型式繼承、寄生式繼承、寄生組合式繼承。

https://github.com/mqyqingfeng/Blog/issues/16

字符串與數字的加減

  • 一元+對數字沒有影響,可以把string轉換成十進制的number。
  • 一元-減對數字相當於負號,對string也是轉換後再加上負號。
  • JavaScript中,字符串與任意數據類型用加號連接,都表示字符串的拼接。
  • 減法時會直接轉換成十進制的number再相減。注意不是ASCII碼的相減!

常見函數的運用:

  • sort函數以及參數A,B:簡單來說就是sort默認按照字符串Unicode碼點的排序,函數返回值的一個排序好的數組。通過參數來調整排序方法,這個參數必須是函數,也就是比較函數。比較函數有兩個參數,反映了數組中任意兩個數的關係。
    • 比較函數返回值爲負數時, 代表第一個比第二個小, 數組將按照升序排列;0 代表相等; 正數代表第一個參數大於第二個參數, 數組將按照升序排列。 這裏的大小時相對的概念, 比較函數確定小的數排在前面。
    • 其實比較函數相當於對結果進行一個冒泡排序。因爲sort默認的排序可以看過按照ASCII碼從小到大排序,所以function(a, b)(return a- b)。 比較函數返回正,代表a大於b, 就會將b排在前面;如果返回爲負數嗎代表a小於b,會將a排在前面;所以如果我們給結果加一個負號,就能夠逆向排序。

JavaScript的對象

  • 全局的對象( global objects )或稱標準內置對象,不要和 “全局對象(global object)” 混淆。這裏說的全局的對象是說在全局作用域裏的對象“全局對象 (global object)”可以在全局作用域裏,通過this訪問(但只有在 ECMAScript 5 的非嚴格模式下纔可以,在嚴格模式下得到的是 undefined)。

  • JS中,可以將對象分爲“內部對象”、“宿主對象”和“自定義對象”三種。

    • js中的內部對象也就是全局的對象
    1. 值屬性:Infinity,NaN,undefined,null 字面量,
      globalThis。這些全局屬性返回一個簡單值,這些值沒有自己的屬性和方法。

    2. 函數屬性:eval(),uneval(),isFinite(),isNaN(),parseFloat(),parseInt(),decodeURI(),decodeURIComponent(),encodeURI(),encodeURIComponent()。可以直接調用,不需要在調用時指定所屬對象,執行結束後會將結果直接返回給調用者。

    3. 基本對象 :顧名思義,基本對象是定義或使用其他對象的基礎。基本對象包括一般對象、函數對象和錯誤對象。Object,Function,Boolean,Symbol。其中 錯誤對象是一種特殊的基本對象,它們擁有基本的 Error 類型,同時也有多種具體的錯誤類型。

      Error,AggregateError,EvalError,InternalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError。

    4. 數字和日期對象:用來表示數字、日期和執行數學計算的對象。Number,BigInt,Math,Date。

    5. 字符串:用來表示和操作字符串的對象。String,RegExp。

    6. 可索引的集合對象:這些對象表示按照索引值來排序的數據集合,包括數組和類型數組,以及類數組結構的對象。Array,Int8Array,Uint8Array等。

    7. 使用鍵的集合對象:這些集合對象在存儲數據時會使用到鍵,包括可迭代的Map 和 Set,支持按照插入順序來迭代元素。Map,Set,WeakMap,WeakSet。

    8. 結構化數據:這些對象用來表示和操作結構化的緩衝區數據,或使用 JSON (JavaScript Object Notation)編碼的數據。ArrayBuffer,SharedArrayBuffer ,Atomics ,DataView,JSON。

    9. 控制抽象對象:Promise,Generator,GeneratorFunction,AsyncFunction,Iterator,AsyncIterator。

    10. 反射:Reflect,Proxy 。

    11. 國際化:ECMAScript核心的附加功能,用於支持多語言處理。Intl,Intl.Collator等。

    12. WebAssembly:WebAssembly等。

    13. 其他:arguments。

    • 宿主對象就是執行JS腳本的環境提供的對象。對於嵌入到網頁中的JS來說,其宿主對象就是瀏覽器提供的對象,所以又稱爲瀏覽器對象,如IE、Firefox等瀏覽器提供的對象。不同的瀏覽器提供的宿主對象可能不同,即使提供的對象相同,其實現方式也大相徑庭。這會帶來瀏覽器兼容問題,增加開發難度。瀏覽器對象有很多,如Window和Document,Element,form,image等等。
    • 顧名思義,就是開發人員自己定義的對象。JS允許使用自定義對象,使JS應用及功能得到擴充。

事件的處理機制

  • 阻止默認事件:
    e.preventDefault()
    e.returnValue = false (IE)
    阻止冒泡:
    e.stopPropagation()
    e.cancelBubble = true (IE)

頁面生命週期

在這裏插入圖片描述

  • 當解析過程遇到<script>時會無法繼續構建DOM樹,會立即執行腳本。DOMContentLoaded可能在所有腳本執行完畢後觸發。

  • 同時javascript的執行會受到標籤前面樣式文件的影響。如果在標籤前面有樣式文件,需要樣式文件加載並解析完畢後才執行腳本。這是因爲javascript可以查詢對象的樣式。

  • DOMContentLoaded:瀏覽器已經完成加載了HTML,DOM樹已經構建完畢,除了那些外部使用異步(async)或延遲(defer)加載的腳本和像<img>和樣式表等外部資源可能並沒有加載完。此時可以遍歷所有DOM節點,初始化頁面。

    • 支持DOMContentLoaded事件的,就使用DOMContentLoaded事件;
    • IE6、IE7不支持DOMContentLoaded,但它支持onreadystatechange事件,該事件的目的是提供與文檔或元素的加載狀態有關的信息。
    • 更低的ie還有個特有的方法doScroll, 通過間隔調用:document.documentElement.doScroll("left");
  • JS有可能去獲取DOM的樣式,所有JS會等待樣式表加載完畢,而JS是阻塞DOM解析的,所以在有外部樣式表的時候,JS會一直阻塞到外部樣式表下載完畢

  • load:瀏覽器加載完所有資源,可以在此事件觸發時獲得圖像大小。

    • window.onload:window對象上的onload事件在所有文件包括樣式表,圖片和其他資源下載完畢後觸發。
    • 在用jquery的時候,我們一般都會將函數調用寫在ready方法內,就是頁面被解析後,我們就可以訪問整個頁面的所有dom元素,可以縮短頁面的可交互時間,提高整個頁面的體驗。
  • beforeunload/unload:用戶正在離開頁面:可以詢問用戶是否保存了更改以及是否確定要離開頁面。

  • 現代瀏覽器爲了更好的用戶體驗,渲染引擎將嘗試儘快在屏幕上顯示的內容。它在所有HTML解析之前開始構建和佈局渲染樹rendertree。也就是說瀏覽器能夠渲染不完整的dom樹和cssom,儘快的減少白屏的時間。因此css放在頭部,將js文件放在尾部。

  • DOM節點:在 HTML DOM (Document Object Model) 中 , 每一個元素都是節點,文檔是一個文檔節點,元素是一個元素節點。

  • Document對象:當瀏覽器載入 HTML 文檔, 它就會成爲 Document 對象。Document 對象是 HTML 文檔的根節點。Document 對象使我們可以從JavaScript中對 HTML 頁面中的所有元素進行訪問。注意:Document 對象是 Window 對象的一部分,可通過 window.document 屬性對其進行訪問。

  • Document.readyState表示文檔的當前狀態,可以在readystatechange事件中跟蹤文檔狀態的變更。

    loading – 文檔正在載入。
    interactive – document已經解析完畢時觸發,幾乎與DOMContentLoaded同時發生,但DOMContentLoaded事件之前觸發。
    complete – 文檔和資源加載完成時觸發,幾乎與window.onload同時發生,但在onload事件之前觸發。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章