1. 程式人生 > >學習筆記 第十五章 JavaScript基礎

學習筆記 第十五章 JavaScript基礎

continue 分隔符 全部 scrip 允許 非循環 元素 當前 避免

第15章 JavaScript基礎

【學習重點】

  • 了解JavaScript基礎知識
  • 熟悉常量和變量
  • 能夠使用表達式和運算符
  • 正確使用語句
  • 能夠掌握數據類型和轉換的基本方法
  • 正確使用函數、對象、數組等核心知識和技法
  • 能夠編寫簡單的腳本,解決網頁中常見特效和互動效果

15.1 JavaScript入門

JavaScript是一種輕量級、解釋型的Web開發語言。現代瀏覽器都已嵌入了JavaScript引擎。/sc

15.1.1 在網頁中插入JavaScript代碼

使用<script>標簽,可以把JavaScript源代碼直接放到網頁文檔中。

<script>和</script>標簽配合使用,作為腳本語言的標識符來分隔其它源代碼,避免混淆。

一般來說,JavaScript代碼可以放在網頁中的任意位置。但是,根據W3C標準,<script>和<link>標簽作為HTML文檔的一個節點,也應該包含在<html>和</html>根節點內。

每個網頁可以包含多個<script>標簽,每個標簽包含的代碼被稱為JavaScript腳本塊。建議把功能相同或相近的代碼放在一個腳本塊中。適當時可以把通用腳本模塊放在單獨的JavaScript文件中,或者把它們封在一個獨立的對象以方便調用。

15.1.2 使用JavaScript文件

JavaScript文件是一個文本類型的文件,在任何文本編輯器中都可以打開、編輯,JavaScript文件的擴展名是js。

引入JavaScript文件時,可以使用<script>標簽實現,通過該標簽的src屬性指定JavaScript文件的URL即可。

15.1.3 JavaScript語法基礎

1、語言編碼

JavaScript語言建立在Unicode字符集基礎上,在腳本中,用戶可以使用雙字節的字符命名常量、變量或函數等。

建議用戶不要使用中文命名,但在註釋中可以考慮中文字符。

2、大小寫敏感

與HTML標簽和CSS樣式碼不同,JavaScript對於大小寫敏感。為了避免出錯,建議使用小寫字符命名變量;對於保留字可以根據系統的默認大小來輸入;對於特定變量,可以使用大寫字符,或者以大寫字符開頭。

對於復合型變量名稱,可以遵循一般編程的駝峰式命名法——名稱的第一個單詞全部小寫,後面的單詞首字母大寫。

3、代碼格式化

JavaScript一般忽略分隔符,如空格符、制表符合換行符。在保證不引起歧義的情況下,用戶可以利用分隔符對腳本進行排版。但不能在連在一起的變量名、關鍵字中間插入分隔符。

4、代碼註釋

JavaScript支持兩種註釋形式:

  • 單行註釋,以雙斜杠表示
    //這是單行註釋
  • 多行註釋,以“/*”和“*/”分隔符進行標識
    /*
    多行註釋
    多行註釋
    */go

5、標簽

在JavaScript腳本中可以加上標簽,方便JavaScript程序進行快速定位。標簽一般由一個合法的字符名稱加上一個冒號組成。標簽可以為該行設置一個標記,在結構體中使用break、continue等跳轉語句跳出循環。

6、關鍵字和保留字

關鍵字是指JavaScript默認定義具有特殊含義的詞匯,如指令名、語句名、函數名、方法名、對象名、屬性名。

保留字就是現在還沒使用,但預留以後作為關鍵字使用。

15.1.4 認識JavaScript語法特性

構成JavaScript語言的基本語素包括3種,與漢語語法類似,說明如下:

  1. 詞是JavaScript語言的最小語義單元,包括常量、變量、運算符、表達式、指令、修飾符等。詞之間以空格進行分隔。

  2. 句子

    句子是由一個或多個詞構成的完整邏輯部分,句子以分號作為結束標誌,也可以只以換行符作為結束標誌。

  3. 段落

    段落是由一對大括號包含的一段代碼,段落內容可以是一句或多句完整的句子,也可以在段落內嵌套另一個段落,形成結構嵌套。

    段落前面可以添加修飾詞——限制對象的謂詞。謂詞有域謂詞(指明對象的作用域或作用範圍)、邏輯謂詞(邏輯關系)、函數謂詞(函數名、函數參數等)。

JavaScript語言還大量使用標點符號作為命令或語法符號,如大括號{}、中括號和小括號等。

  1. 對象({})

    對象都以左大括號({)開始,以右大括號(})結束,裏面一個或多個“名/值”對,“名/值”對之間沒有先後順序關系。

    每個“名/值”對內的“名稱”和“值”之間使用冒號(:)進行分隔,而“名/值”對與“名/值”對之間使用逗號分隔。

    使用點號可以引用對象的屬性和方法,在調用對象方法時應在函數名稱後面補加小括號。

  2. 數組([])

    數組以左中括號([)開始,以右中括號(])結束,中間可以包含多值,值之間使用逗號分隔。數組(array)是值(value)的有序集合。

  3. 調用和邏輯分隔(())

    在JavaScript中,小括號表示一個運算符,用於調用函數。小括號也可以作為邏輯分隔符,在定義函數時,放在函數名稱的後面,用來分隔函數和參數。

15.2 常量和變量

JavaScript暫不支持constant關鍵字,不允許用戶自定義常量,但是提供了幾個默認常量供開發使用。

  • Math.E:常量e,自然對數的底數;
  • Math.LN10:10的自然對數;
  • Math.LN2:2的自然對數;
  • Math.LOG10E:以10為底的e的對數;
  • Math.LOG2E:以2為底的e的對數;
  • Math.PI:常量PI;
  • Math.SQRT1_2:1/2的平方根;
  • Math.SQRT2:2的平方根;
  • Number.MAX_VALUE:可表示的最大的數;
  • Number.MIN_VALUE:可表示的最小的數;
  • Number.NaN:非數字值;
  • Number.NEGATIVE_INFINITY:負無窮大,溢出時返回該值;
  • Number.POSITIVE_INFINITY:正無窮大,溢出時返回該值。

JavaScript使用var關鍵字聲明變量。

JavaScript也支持不使用var命令,直接使用未聲明的變量,但建議先聲明後使用。

聲明變量之後,在沒有初始化之前,則它的初始值為undefined(未定義的值)。

變量命名規則如下:

  • 首字符必須是大寫或小寫的字母、下劃線或美元符,後續的字母可以是字母、數字、下劃線或美元符;
  • 變量名稱不能是JavaScript關鍵字或保留字;
  • 變量名稱長度任意,區分大小寫。

還有一些軟約束:

  • 變量聲明集中、置頂,如文檔的前面、代碼段的前面,或者函數內的上面;
  • 使用局部變量,不要把所有的變量放在段首,如果僅在函數內使用,建議在函數內聲明;
  • 變量名應該易於理解;
  • 聲明變量之前,應該規劃好,避免類似usrname與usrName混用現象。

在函數內部使用var關鍵字聲明的變量就是私有變量,該變量的作用域僅限於當前函數體內,但是如果不使用var關鍵字定義的變量都是全局變量,不管是在函數內或者函數外,在整個頁面腳本中都是可見的。

15.3 表達式和運算符

表達式是指可以運算,且必須返回一個確定的值的式子。表達式一般有常量、變量、運算符、字表達式構成。

值表達式的返回值為它本身,而變量表達式的返回值為變量存儲或引用的值。

把簡單的表達式合並為一個復雜的表達式,連接表達式的符號就是運算符。

運算符一般使用符號來表示,如“+”、“-”;也有些運算符使用關鍵字來表示,如deleter、void。

作用於運算符的子表達式被稱為操作數。根據結合操作數的個數,JavaScript運算符可以分為:

  • 一元運算符,把一個操作數運算後轉換為另一個操作數;
  • 二元運算符,結合兩個操作數;
  • 三元運算符,能夠結合三格操作數,JavaScript僅定義了一個三元運算符(?:),相當於條件語句。

15.4 語句

語句就是JavaScript指令,可以設計程序的邏輯執行順序。

15.4.1 表達式語句和語句塊

如果在表達式的尾部附加一個分號就會形成一個表達式語句。JavaScript默認獨立一行的表達式也是一個表達式語句。

語句塊就是由大括號包含的一個或多個語句。

15.4.2 條件語句

程序的基本邏輯結構包括3種:順序、選擇和循環。大部分控制語句屬於順序結構,條件語句屬於選擇結構,包括if語句和switch語句兩種。

1、if語句

if語句的基本語法如下:

if(condition)
  statements

其中condition是一個表達式,statement是一個句子或段落。當condition表達式的結果不是false,那麽就執行statements從句的內容。

在if語句的基本形式上還可以擴展如下語法,表示condition表達式條件為true,則執行statements1從句,否則執行statements從句。

if (condition)
  statements1
else
  statements2

2、switch語句

對於多條件的嵌套結構,更簡潔的方法是使用switch語句。語法如下:

switch (expression){
     case label1:
          statement1;
          break;
     case label2:
          statement2;
          break;
     ...
     default : statementn;
}

switch語句首先計算switch關鍵字後面的表達式,然後按出現的先後順序計算case後面的表達式,直到找到與switch表達式的值等同(===)的值為止。case表達式通過等同運算來進行判斷,因此表達式匹配的時候不進行類型轉換。

15.4.3 循環語句

循環語句——能夠重復執行相同操作的語句。兩種基本語法形式:while語句和for語句。

1、while語句

while(condition){
     statements
}

每次循環前計算condition表達式。如果為true,執行循環體內的語句;如果為false,跳出循環,執行while語句後面的語句。

while語句有一種變體:

do
     statements
while(condition);

首先執行statement一次,在每次循環結束之後計算condition條件。

2、for語句

比while語句簡潔

for([initial-expression;][condition;][increment-expression]){
    statements
}

先計算初始化表達式(initial-expression),典型情況下用於初始化計數器變量,可選用var聲明新變量;

條件測試是可選的,如果缺省則條件始終為true,除非循環體內使用break語句,否則不能終止循環;

increment-expression表達式用於更新或自增計數器變量。

15.4.4 跳轉語句

跳轉語句能夠從所在的分支、循環或從函數調用返回的語句跳出。JavaScript的跳出語句包括3種:break、continue、return。

break用來跳出循環或者switch語句。語法為:

break;

跳轉語句可以與標記結合使用,以實現跳轉到指定的行,而不是僅僅跳出循環體。

x: for(a=1; a<10; a++){
   document.write("<br />"+a+"<br />");
   for(var b=1;b<10;b++){
        if (a>5) break x;
   }
}

continue語句的用法與break類似,但是continue不會退出循環,而是重新執行循環語句。continue只能用在循環體中。

return用來指定函數的返回值,只能夠用在函數或者閉包中。語法如下:

return [expression]

先計算expression表達式,然後返回表達式的值,並將控制邏輯從函數體內返回。

15.4.5 異常處理語句

異常表示一種非正常的信息,提示程序出現了錯誤。JavaScript通過一定的機制使異常信號暴露出來,這個操作被稱為拋出(throw);使用異常處理語句捕獲(catch)這個異常,進行處理。

JavaScript中使用try、catch、finally來作異常處理的語句。語法如下:

try  {                                      //執行語句
            CreateException();
}
catch(ex)                                   //捕獲異常
{
            alert(ex.number+"\n"+ex.description);
}
finally                                     //最後必須執行的語句
{
            alert("end");
}

15.4.6 var語句和function語句變量

var語句聲明一個或多個變量,可以在聲明變量時進行初始化。默認變量初始值為undefined。

function用來定義函數,基本形式如下:

function [name][param],[param],...[param]){
     statements
}

name表示函數的名稱,param表示要傳遞給函數的參數名稱,一個函數最多可以有255個參數。

15.4.7 with語句和空語句

with語句能夠為一組語句創建缺省的對象,用法如下:

with(object){
    statements
}

with語句能夠破變量的作用域鏈,不建議使用。

空語句只有一個獨立的分號,作用是創建一個主體為空的條件或者循環。如:

while(true){
      ;
}

上面代碼創建了一個主體為空的循環。

15.5 數據類型

JavaScript中,數據存在兩種截然不同的存儲方式。一種是直接存儲數據,稱為值類型數據;一種是存儲數據的空間地址來間接保存數據,稱為引用型數據。

15.5.1 數值

JavaScript包含3種基本數據類型:數值、字符串和布爾值。

JavaScript數值不區分整型和浮點數,所有數值都為浮點型數值。

使用toString()方法可以把數值轉換為字符串。

使用數值與空字符串相加,即可把數值轉換為字符串。

var a=100;
var c=a+"";
alert(typeof(c));

15.5.2 字符串

字符串由Unicode字符、數字、標點符號等組成的字符序列,必須用單引號或雙引號包括起來。所有字符應該在同一行內書寫。

var str1="字符串序列";
var str2="‘JavaScript‘不是‘Java‘";
var str3=‘<meta charset="utf-8">‘;

使用parseInt()和parseFloat()方法可以把字符串轉換為數值。

便捷方法:讓字符串與1相乘,即可把字符串快速轉換為數值。

15.5.3 布爾值

布爾型數據僅兩個值:true和false,分別表示邏輯的真和假。布爾值多用在邏輯運算、比較運算中,或者作為條件語句或運算符的條件而使用。

要把任何值轉換為布爾值數據,在值的前面增加兩個嘆號即可。

任何非0數字轉換為布爾值為true,而0轉換為布爾值為false。

任何非空字符串轉換為布爾值為true,而空格轉換為布爾值為false。

如果把布爾值轉換為字符串,則true為“true”,false為“false”。

如果把布爾值轉換為數字,則true為1,false為0。

JavaScript語法系統有一組假值,布爾值都是false,具體如下:

0                                     //Number
NaN                                 //Number
‘‘                                      //String
false                                //Boolean
null                                  //Object
undefined                         //Undefined

15.5.4 null和undefined

null是Null類型的值,表示空值。當對象為空,或者變量沒有引用任何對象,返回值為null。

undefined表示未定義的值,當變量未初始化時,會默認其值為undefined。

15.5.5 引用型數據

引用型數據包括:數組、對象和函數等。將在下面各節詳解。

15.6 函數

15.6.1 定義函數

定義函數的方法有兩種:

  • 使用function語句聲明函數;
  • 通過function對象來構造函數。

使用function來定義函數有兩種方式:

//方式1:命名函數
function f() {
      //函數體
}
//方式2:匿名函數
var f=function(){
      //函數體
}

匿名函數的方法也被稱為引用式函數或函數表達式,即把函數看做一個復雜的表達式,並把表達式賦予給變量。

使用Function對象構造函數的語法如下:

var function_name=new Function(arg1, arg2, ..., argN, function_body)

每個arg都是一個函數參數,最後一個參數是函數主體(要執行的代碼)。Function()的所有參數必須是字符串。

15.6.2 調用函數

調用函數使用小括號運算符來實現。在括號運算符內部可以包含多個參數列表,參數之間通過逗號分隔。例如:

function f(){  
     return "Hello, World!";            //設置函數返回值
}
document.write(f());                    //調用函數,並輸出返回值

一個函數可以包含多個return語句,但是在調用函數時只有第一個return語句被執行,且該return後面的表達式的值作為函數的返回值被返回,return語句後面的代碼將被忽略掉。

函數的返回值沒有類型限制,它可以返回任意類型的值。

15.6.3 函數參數

參數可以分為兩種:形參和實參。

  • 形參是定義函數時,傳遞給函數的參數,形式上參數;
  • 實參是當函數被調用時,傳給函數的參數。

如果形參多於實參,多出的形參值為undefined;如果形參少於實參,多出的實參被忽略掉。

JavaScript定義了Arguments對象,利用該對象可以快速操縱函數的實參。使用arguments.length可以獲取函數實參的個數,使用數組下標(arguments[n])可以獲取實際傳遞給函數的每個參數值。

15.6.4 函數應用

1、匿名函數

當只需要一次性使用函數時,使用匿名函數會更加有效率。

var z=function(x,y){
     return (x+y)/2;
}  (23,35);            //返回29

2、函數作為值

函數實際上是一種結構復雜的數據,因此可以把它作為值賦予給其它變量。

var a=function(x, y) {
        return (x+y)/2;
}
alert ( a(12,33) );             //返回22.5

3、函數作為參數

函數作為值可以傳遞,因此可以把函數作為參數傳遞給另一個函數,也可以作為返回值。

4、函數作為表達式

函數可以參與到表達式運算中。

15.6.5 閉包函數

閉包是一個擁有許多變量和綁定了這些變量的環境的表達式。閉包函數(外部函數)被調用後,它的變量不會消失,仍然被內部函數所使用,而且所有的內部函數擁有對外部函數的訪問權限。

15.7 對象

對象時面對對象編程的核心概念,它是已經命名的數據集合,也是一種更復雜的數據結構。

15.7.1 創建對象

對象是由new運算符生成,生成對象的函數被稱為類(或構造函數、對象類型)。生成的對象被稱為類的實例,簡稱對象。

var o=new Object();                         //構造原型對象
var date=new Date();                        //構造日期對象
var ptn=new RegExp("ab+c","i");             //構造正則表達式對象

也可以通過大括號定義對象直接量,用法如下:

{
       name: value,
       name1:value1,
       ......
}

對象直接量由一個列表構成,元素是用冒號分隔的屬性/值對,元素之間用逗號分開。

15.7.2 訪問對象

可以通過點號運算符(.)來訪問對象的屬性,如

var point={
         x:2.3,
         y:-1.2 
};
var x=point.x;                    //訪問對象的屬性值

當屬性值為函數時,該屬性就被稱為對象的方法,使用小括號可以訪問該方法。

var point={
     f: function(){                                //對象方法
              return this.y;                       //返回當前對象屬性y的值
            },
     y:1.2                                         //對象屬性
};
var y=point.f();                                   //調用對象的方法

上面代碼中,關鍵字this代表當前對象,這裏的this總是指向調用當前方法的對象point。

當屬性為對象時,就可以設計嵌套對象,可以連續使用點號運算符訪問內部對象。

var point= {                                     //外部對象
     x : {                                       //嵌套對象
                    a : 1,                       //內部對象的屬性
                    b : 2
          },
     y : 1.2                                     //外部對象的屬性
};
var a= point.x.a;                                //訪問嵌套對象的屬性值

也可以通過集合運算符([])來訪問對象的屬性,此時可以使用字符串下標來表示屬性。

var point= {                                     //外部對象
     x : {                                       //嵌套對象
                    a : 1,                       //內部對象的屬性
                    b : 2
          },
     y : 1.2                                     //外部對象的屬性
};
var a= point["x"]["a"];                          //訪問嵌套對象的屬性值

15.8 數組

對象是無序的數據集合,而數組(Array)是一組有序數據集合。它們之間可以相互轉換。

15.8.1 定義數組

通過構造函數Array()和運算符new來實現。

(1)定義空數組

var a=new Array();

(2)定義帶有參數的數組

var a=new Array(1,2,3,"4","5");

數組中每個參數都表示數組的一個元素值,數組的元素沒有類型限制。可以通過數組下標定位元素,通過數組的length屬性確定數組的長度。

(3)定義指定長度的數組

var a=new Array(6);

沒有為元素初始化賦值,它們的初始值都是undefined。

定義數組時,可以省略new運算符,直接使用Array()函數來實現。

(4)定義數組直接量

var a=[1,2,3,"4","5"];

15.8.2 存取元素

使用[]運算符可以存取數組元素的值。方括號左邊是數組的應用,方括號內是非負整數值的表達式。如:

var a=[1,2,3,"4","5"];
a[2]=2;                                          //修改第二個元素的值
alert(a[2]);                                     //提示為2

數組的大小不固定,可以動態增加或刪除數組元素。

1、通過改變數組的length屬性來實現

var a=[1,2,3,4,5];
a.length=4;
document.write(a);

當改變數組的長度時,會自動在數組的末尾增加或刪除元素,以實現改變數組的大小。

使用delete運算符可以刪除數組元素的值,但是不會改變length屬性的值。

2、使用push()和pop()方法來操作數組

push()可以在數組的末尾插入一個或多個元素,pop()可以依次把它們從數組中刪除。

var a=[];                              //定義一個空數組
a.push(1,2,3);                         //得到數組[1,2,3]
a.push(4,5);                           //得到數組[1,2,3,4,5]
a.pop();                               //得到數組[1,2,3,4]

push()可以帶多個任意類型的參數,按順序插入到數組末尾,並返回操作後數組的長度。

pop()方法不帶參數,返回數組中最後一個元素的值。

3、使用unshift()和shift()方法

和push()/pop()方法操作類似,但是作用於數組的頭部。

4、使用splice()方法

通用刪除和插入元素的方法,可以在數組指定的位置開始刪除或插入元素。

3個參數:指定插入的起始位置,指定要刪除元素的個數,表示插入的具體元素。

var a=[1,2,3,4,5,6];
var b=a.splice(2,2);
document.write(a+"<br />");                                //輸出[1,2,5,6]
document.write(b);                                         //輸出[3,4]
var a=[1,2,3,4,5,6];
var b=a.splice(2,2,7,8,9);
document.write(a+"<br />");                          //輸出[1,2,7,8,9,5,6]
document.write(b);                                   //輸出[3,4]

15.8.3 數組應用

1、數組與字符串互轉

join()可以把數組轉換為多種形式的字符串,join()包含一個參數——用來定義合並元素的連字符。如果不提供參數,默認以逗號連接。

var a=[1,2,3,4,5];
a=a.join("-");
document.write("a類型="+typeof(a)+"<br />");
document.write("a的值="+a);

split()可以把字符串劈開為一個數組,包含兩個參數——指定劈開的分隔符,指定返回數組的長度。

var a=[1,2,3,4,5];
a=a.join("-");
var s=a.split("-");
document.write("s類型="+typeof(s)+"<br />");
document.write("s的值="+s);

2、數組排順

使用reverse()方法可以顛倒數組元素的順序,該方法是在原數組基礎上進行操作,不會新建數組。

sort()方法能夠對於數組中的元素進行排序,排序的方法由其參數決定。這個參數是一個比較兩個元素值的閉包。如果省略參數,則sort()方法按默認規則排序。

var a=[3,2,5,1,4];
var f=function(x,y){
         return y-x;
};
var b=a.sort(f);
document.write(b);              //輸出[5,4,3,2,1]

3、連接數組

concat()方法能夠把該方法中的參數追加到指定數組中,形成新的數組。如果concat()方法中的參數包含數組,則把數組元素展開添加到數組中。

var a=[1,2,3,4,5];
var b=a.concat([4,5],[1,[2,3]]);
document.write(b);                  //輸出[1,2,3,4,5,4,5,1,2,3]

4、截取子數組

slice()方法將返回數組中指定的片段,包含兩個參數——要返回子數組在原數組中的起止點。第一個參數指定的元素被截取,第二個參數指定的元素不被截取。

var a=[1,2,3,4,5,6,7,8,9];
var b=a.slice(2,5);
document.write(b);                      //輸出[3,4,5]

學習筆記 第十五章 JavaScript基礎