JavaScript學習筆記
1. JavaScript簡介
1.1JavaScript 實現
一個完整的JavaScript應該由下列三部分組成:
- 核心(ECMAScript):由ECMA-262定義,提供核心語言功能
- 文件物件模型(DOM):提供訪問和操作頁面內容的方法和介面
- 瀏覽器物件模型(BOM):提供與瀏覽器互動的方法和介面
1.2 DOM級別
- DOM1級:由兩個模組組成:DOM核心(DOM Core)和DOM HTML。其中,DOM核心規定的是如何對映基於XML的文件結構,以便簡化對文件中任意部分的訪問和操作。DOM HTML模組則再DOM核心的基礎上加以擴充套件,添加了針對HTML的物件和方法。DOM1級的目標主要是對映文件的結構。
- DOM2級:在原來DOM的基礎上又擴充了滑鼠和使用者介面時間、範圍、遍歷(迭代DOM文件的方法)等細分模組,而且通過物件介面添加了對CSS的支援
- DOM3級:引入了以統一方式載入和儲存文件的方法——在DOM載入和儲存模組中定義;新增了驗證文件的方式——在DOM驗證模組中定義。DOM3級也對DOM核心進行了推廣,開始支援XML 1.0規範,涉及XML Infoset、Xpath和XML Base。
2. 在HTML中使用JavaScript
2.1 文件模型
- 混雜模型
- 標準模型
2.2 <noscript>元素
使用<noscript>元素可以指定在不支援指令碼的瀏覽器中顯示的替代內容。但在啟動了指令碼的情況下,瀏覽器不會顯示<noscript>元素中的任何內容。
3 基本概念
3.1 語法
識別符號:就是指變數、函式、屬性的名字,或者函式的引數。識別符號可以是按照下列格式規則組合起來的一個或多個字元:
- 第一個字元必須是一個字母、下劃線(_)或一個美元符號($)
- 其他字元可以是字母、下劃線、美元符號或者數字。
3.2 資料型別
ECMAScript中有5種簡單資料型別(也稱為基本資料型別):Undefined、Null、Boolean、Number和String。還有1種複雜資料型別——Object
3.3 語句
3.3.1 label語句
使用label語句可以在程式碼中新增標籤,以便將來使用。以下是label語句的語法:
label: statement
下面是一個示例:
start: for(var i = 0; i < count; i++) { alert(i); }
這個例子中定義的start標籤可以在將來由break或continue語句引用。加標籤的語句一般都要與for語句等迴圈語句配合使用。
3.3.2 with語句
with語句的作用是將程式碼的作用域設定到一個特定的物件中。with語句的語法如下:
with (expression) statement;
定義with語句的目的主要是為了簡化多次編寫同一個物件的工作,如下面的例子所示:
var qs = location.search.substring(1); var hostName = location.hostname; var url = location.href;
上面幾行程式碼都包含location物件。如果使用with語句,可以把上面的程式碼改寫成如下所示:
with(location) { var qs = search.substring(1); var hostName = hostname; var url = href; }
3.4 函式
ECMAScript函式的引數與大多數其他語言中函式的引數有所不同。ECMAScript函式不介意傳遞進來多少個引數,也不在乎傳進來引數是什麼資料型別。在函式體內可以通過arguments物件來訪問這個引數陣列,從而獲取傳遞給函式的被一個引數。
ECMAScript函式不能像傳統意義上那樣實現過載,如果在ECMAScript中定義了兩個名字相同的函式,則該名字只屬於後定義的函式。
4. 變數、作用域和記憶體問題
4.1 基本資料型別和引用資料型別
基本資料型別指的是簡單的資料段,而引用型別值指那些可能由多個值構成的物件。
4.2 執行環境及作用域
執行環境是JavaScript中最為重要的一個概念。執行環境定義了變數或函式有權訪問的其他資料,決定了它們各自的行為。每個執行環境都有一個與之關聯的變數物件,環境中定義的所有變數和函式都儲存在這個物件中。
當代碼在一個環境中執行時,會建立變數物件的一個作用域鏈。作用域鏈的用途,是保證對執行環境有權訪問的所有變數和函式的有序訪問。作用域鏈的前端,始終都是當前執行的程式碼所在環境的變數物件。
JavaScript沒有塊級作用域
4.3 垃圾收集
JavaScript具有自動垃圾收集機制。這種垃圾收集機制的原理很簡單:找出那些不再繼續使用的變數,然後釋放其佔用的記憶體。為此,垃圾收集器會按照固定的時間間隔(或程式碼執行中預定的收集時間),週期性地執行這一操作。
- 標記清除:是目前主流得到垃圾收集演算法,這種演算法的思想是給當前不使用的值加上標記,然後再回收其記憶體。
- 引用計數:這種演算法的思想是跟蹤記錄所有值被引用的次數。JavaScript引擎目前都不再使用這種演算法;但在IE中訪問非原生JavaScript物件(如DOM元素)時,這種演算法仍然可能會導致問題。
5. 引用型別
5.1 Object型別
5.2 Array型別
5.2.1 監測陣列
if(value instanceof Array) { //對陣列執行某些操作 } if(Array.isArray(value)) { //對陣列執行某些操作 }
5.2.2 轉換方法
toString() 、valueOf()、toLocaleString()、join()
5.2.3 棧方法
push()、pop()
5.2.4 佇列方法
結合使用shift()和push()方法,可以像使用佇列一樣使用陣列,在列表末端新增項,從前端移除項。
同時使用unshift()和pop()方法,可以從相反的方向來模擬佇列。
5.2.5 重排序方法
reverse()降序、sort()升序
5.2.6 操作方法
concat()合併
var colors = ["red", "green", "blue"]; var colors2 = colors.concat("yellow", ["black", "brown"]); alert(colors); // red,green,blue alert(colors2); //red.green,blue,yellow,black,brown
slice()裁剪
var colors = ["red", "green", "blue", "yellow", "purple"]; var colors2 = colors.slice(1); var colors3 = colors.slice(1, 4); alert(colors2); // green,blue,yellow purple alert(colors3); // green,blue,yellow
splice() 向陣列的中部插入項
var colors = ["red", "green", "blue"]; var removed = colors.splice(0, 1); //刪除第一項 alert(colors); // green, blue alert(removed); // red, 返回的陣列中只包含一項 removed = colors.splice(1, 0, "yellow", "orange"); //從位置1開始插入兩項 alert(colors); // green, yellow, orange, blue alert(removed); // 返回的是一個空陣列 removed = colors.splice(1, 1, "red", "purple"); //插入兩項,刪除一項 alert(colors); // green, red, purple, orange, blue alert(removed); // yellow, 返回的陣列中只包含一項
5.2.7 位置方法
- indexOf() :從陣列的開頭開始向後查詢
- lastIndexOf() :從陣列的末尾開始向前查詢
5.2.8 迭代方法
- every() : 對陣列中的每一項執行給定函式,如果該函式對每一項都返回true,則返回true
- filter() : 對陣列中的每一項執行給定函式,返回該函式會返回true的項組成的陣列。
- forEach() : 對陣列中的每一項執行給定函式,這個方法沒有返回值。
- map() : 對陣列中的每一項執行給定函式,返回每次函式呼叫的結果組成的陣列。
- some() : 對陣列中的每一項執行給定函式,如果該函式對任一項返回true,則返回true。
5.2.9 縮小方法
reduce() 和 reduceRight() 這兩個方法都會迭代陣列的所有相,然後構建一個最終返回的值。器重reduce() 方法從陣列的第一項開始,逐個遍歷到最後。而 reduceRight() 則從陣列的最後一項開始,向前遍歷到第一項。
5.3 Date型別
5.4 RegExp型別
5.5 Function 型別
5.5.1 函式是物件,函式名是指標
5.5.2 沒有過載
5.5.3 函式內部屬性
- arguments: 它是一個類陣列物件,包含著傳入函式中的所有引數,這個物件還有一個名叫callee的屬性,該屬性是一個指標,指向擁有這個arguments物件的函式
- this: this引用的是函資料以執行的環境物件
- caller:這個屬性中儲存著呼叫當前函式的函式的引用,如果是在全域性作用域中呼叫單籤函式,它的值為null。
5.5.4 函式屬性和方法
- length:表示函式希望接受的命名引數的個數
- prototype:對於ECMAScript中的引用型別而言,prototype是儲存它們所有例項方法的真正所在
- apply()和call():這兩個方法的用途都是在特定的作用域中呼叫函式,實際上等於設定函式體內this物件的值。apply()方法接收兩個引數:一個是在其中執行函式的作用域,另一個是引數陣列。call()方法:第一個引數是this值沒有變化,變化的是其餘引數都直接傳遞給函式。它們真正強大的地方是能夠擴充函式賴以執行的作用域。
- bind(): 這個方法會建立一個函式的例項,其this值會被繫結到傳給bind()函式的值
5.6 基本包裝型別
為了便於操作基本型別值,ECMAScript還提供了3個特殊的引用型別:Boolean、Number和String。
引用型別與基本包裝型別的主要區別就是物件的生存期。使用new操作符建立的引用型別的例項,在執行流離開當前作用域之後一直存在記憶體中。而自動建立的基本包裝型別的物件,則只存在於一行程式碼的執行瞬間,然後立即被銷燬。
5.6.1 String型別
- 字元方法: charAt()和charCodeAt
- 字串操作方法: concat();slice()、substr()和substring()
- 字串位置方法:indexOf() lastIndexOf()
- trim() 方法: 這個方法會建立一個字串的副本,刪除前置及字尾的所有空格,然後返回結果。
- 字串大小寫轉換方法:toLowerCase()、toLocaleLowerCase()、toUpperCase()和toLocaleUpperCase()
- 字串的模式匹配方法:match()、search()、replace()、split()
- localeCompare()方法:這個方法比較兩個字串
- fromCharCode()方法:這個方法的任務是接收一或多個字元編碼,然後將它們轉換成一個字串。
5.7 單體內建物件
由ECMAScript實現提供的,不依賴於宿主環境的物件,這些物件在ECMAScript程式執行之前就已經存在了。
5.7.1 Global物件
ECMAScript中的Global物件在某種意義上是作為一個終極的“兜底兒物件”來定於的。換句話說,不屬於熱河其他物件的屬性和方法,最終都是它的屬性和方法。
eval():它會將傳入的引數當做實際的ECMAScript語句來解析,然後把執行結果插入到原位置。
5.7.2 Math物件
6 面向物件的程式設計