1. 程式人生 > 實用技巧 >JavaScript學習筆記

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 面向物件的程式設計