【javascript進階程式設計】讀書摘錄1 JavaScript簡介,摘錄javascript
一直在做伺服器端的開發,卻迫不得已要做一些前端頁面的開發。努力惡補js中,順便熟悉下node.js。
目標:前後端兼修。麼麼噠。
第一章、Javascript簡介
1. ECMAScript與javascript的關係
2. DOM層級
DOM0實際上是不存在的標準,指IE4和NetScape4最初支援的DHTML
DOM1主要是映射文檔的結構
DOM2擴充了滑鼠和使用者介面事件、範圍、遍曆等細分模組
DOM3進一步擴充了DOM,引入了統一載入和儲存文檔的方法,新增了驗證文檔的方法;支援XML1.0規範。
3. Javascript包含三個不同的部分組成:
(1) ECMAScript
(2) DOM
(3) BOM
第二章、HTML中使用Javascript
1、 HTML4.01 為<script>定義的屬性:
(1) charset: 可選,表示通過src屬性指定的代碼的字元集
(2) defer: 表示指令碼可以延遲到文檔完全被解析和顯示之後再執行(並不是所有的瀏覽器都支援defer屬性,需要謹慎使用)
(3) language: 已廢棄,原來用於表示編寫代碼使用的指令碼語言,大多數瀏覽器會忽略這個屬性,因此沒有必要再使用了
(4) Src:可選。表示要執行的代碼的外部檔案。
(5) Type:必須,可以看做是language的替代屬性,表示編寫代碼的語言指令碼的內容類型(MIME).考慮到約定俗成和最大程度的瀏覽器安全色性,目前使用的屬性值依舊是“text/javascript”
2、 相容HTML, XHTML的javascript寫法:
<script type="text/javascript">
//<![CDATA[
function compare(a, b){
if(a < b){
return 0;
}else if(a > b){
return 1;
}
return -1;
}
//]]>
3、 盡量將javascript放到檔案中的優點:
(1)、可維護性(放到單獨的js檔案中更加易於維護)
(2)、可緩衝(瀏覽器可以根據設定緩衝js檔案)
(3)、可適應未來(通過檔案引用的方式無需使用前面提到的XHTML或注釋的hack)
4、所有的javascript元素會按照他們在頁面中出現的先後順序依次被解析。只有解析完前面的代碼之後,才會解析後面js元素中的代碼。
第三章、基本概念
1、Javascript中一切變數、函數名和操作符都區分大小寫。
2、ECMAScript具有5種單一資料型別:Undefined、Null、Boolean、Number、String還有一種複雜資料類型:Object。ECMAScript沒有為整數和浮點數分別定義不同的資料類型,Number類型可用於表示所有的數值。
3、typeof用於檢測一個變數的資料類型,返回的是字串:”undefined”, “string”, ”boolean”,”number”,”object”, ”function”
4、浮點數存在浮點數陷阱,其精度不如整數準確。Number.MIN_VALUE Number.MAX_VALUE 如果某個計算的結果超過了Javascript的範圍,那麼被轉換成特殊的Infinity值(負數是-Infinity),該值無法參與下一步的計算。要想確定一個數是不是歐諾個的,可以使用isFinite()函數
5、NaN是一個特殊的數值,這個數值用於表示一個本來要返回數值的操作卻未返回數值的情況。NaN有兩個特點:1、任何涉及NaN的操作都會返回NaN . 2、NaN與任何值都不相等,包括自身。IsNaN函數用於檢查一個參數是否是一NaN。
6、有三個函數可以把非數值類型轉化為數值類型:Number(),parseInt ,parseFloat
7、Object類型。Object的每個執行個體都具有下列屬性和方法:
(1)constructor:儲存著建立當前對象的函數
(2)、hasOwnProperty(): 用於檢查當前的屬性在當前對象執行個體中是否存在(而不是執行個體的原型中)。
(3)、isPrototypeOf(object)檢查一個對象是否是另一個對象的原型。TODO:深入理解原型
(4)、toString() 返回對象的字串表示
(5)、valueOf() 返回對象的字串、數值或者布爾值表示。通常與toString的返回值相同。
(6)、ECMAScript函數沒有重載,如果定義了兩個相同的函數,那麼改名字只屬於後定義的函數
第四章、變數、範圍和記憶體問題
1、基本類型和參考型別:基本類型值是指儲存在棧記憶體中的簡單資料區段,參考型別值則是儲存在堆記憶體中的對象,變數中儲存的實際上是一個指標,這個指標指向記憶體中的另一個位置。該位置儲存對象。只能給參考型別的值添加屬性。
2、基本類型值在複製時產生一個copy, 而參考型別的值在複製時,新值和之前的值都指向同一個對象。
3、ECMAScript中所有函數的參數都是按值傳遞的。
4、對於基本類型的檢測可以使用typeof函數,對於參考型別的值,可以配合instanceof檢測。根據規定,所有的參考型別都是Object的執行個體,因此檢測一個引用變數是否instanceof Object時,總是返回true.
5、執行環境(execute context)與範圍:
執行環境定義了變數或者函數有權訪問的其他資料,決定了它們的行為。每個執行環境都有一個與之關聯的變數對象,環境中定義的所有變數和函數都儲存在這個對象中。
執行環境有全域執行環境和函數執行環境之分。
全域環境只能訪問在全域環境中定義的變數和函數、而不能訪問在局部環境中定義的任何資料。
局部執行環境不僅有權訪問函數範圍中的變數,而且有權訪問其父環境,乃至全域變數
每個函數在被調用時都會建立自己的執行環境,執行流進入一個函數時,函數的環境被推入環境棧中,而在函數執行完畢之後,棧將環境彈出,把控制權返回給之前的執行環境。
代碼在一個環境中執行時,會建立由變數對象構成的一個範圍鏈。範圍鏈的用途,是保證對執行環境有權訪問的所有變數和函數的有序訪問。
標識符解析的過程是驗證範圍鏈一級一級搜尋標識符的過程,搜尋過程始終從範圍鏈的前端開始,然後逐級向後回溯,直到找到標識符為止。
6、延長範圍鏈
(1)try-catch語句的catch塊
(2)with語句
7、在使用var關鍵字聲明變數時,這個變數自動被添加到距離最近的可用環境中。如果變數在未經聲明的情況下被初始化,那麼該變數被自動添加到全域變數(這種方法並不推薦,容易造成錯誤和困擾)。
8、垃圾收集機制。
Javascript具有自動記憶體回收機制,執行環境會負責管理代碼執行過程中使用的記憶體。這種垃圾收集機制的原理比較簡單:找出那些不再繼續使用的記憶體,然後釋放其佔用的記憶體
(1)、標記清除
Javascript中最常使用的垃圾收集方式是標記清除。當變數進入環境時,將變數標誌為“進入環境”,當變數離開環境時,就將變數標記為“離開環境”。垃圾收集器在啟動並執行時候會給儲存在記憶體中的變數都加上標誌,然後去掉環境中的變數和被環境中變數引用的變數的標誌,在這之後仍然帶有標誌的變數將被視為準備刪除的變數。
(2)、引用計數
另一個不太常見的垃圾收集策略是“引用計數”,通過追蹤某個變數的引用次數來判斷是否是垃圾。引用計數的問題在於“循環參考”的垃圾無法清除。例如:
function problem(){
varobj1 = new Object();
varobj2 = new Object();
obj1.aobj= obj2;
obj2.aobj= obj1;
}
為了避免類似的循環參考問題,最好在不使用它們的時候手工中斷連線。
9、垃圾收集器的效能問題。Javascript記憶體管理問題。
確保佔用最少的記憶體可以讓頁面擷取更好的效能,而最佳化記憶體佔用的最佳方式,就是為執行中的代碼只儲存必要的資料,一旦資料不再使用,應該將其值設定為null來釋放其引用(解除引用)。解除引用並不意味著自動回收該值所佔的記憶體。解除引用的真正作用在於讓值脫離執行環境,以便垃圾收集器下次運行時將其回收。