1.1 什麼是腳本語言
在學習JavaScript之前,首先來了解一下腳本語言(Scripting Language)。腳本語言就是一種簡單的程序,它由一些ASCII碼組成,並可以用“記事本”等文本編輯器直接對其進行開發。
有些程序,如C、C++、Java等則必須先經過編譯,將源代碼轉換爲二進制代碼之後纔可執行。而像Perl、JavaScript、VBScript等則不需要事先編譯,只要利用合適的解釋器便可以執行代碼。
網站發展的初期,所有的程序都是在服務器端執行,然後再將執行結果發送到客戶端。隨着客戶端計算機的功能越來越強大,CPU速度越來越快,如果將部分簡單的操作交給客戶端的計算機處理,這樣就可以大大提高服務器的工作效率。這時候網頁腳本語言就應運而生了,因爲這種腳本語言能夠與一般的HTML語言交互使用。在讀取網頁的同時,腳本語言編寫的小程序也被傳輸到客戶機上,並在客戶機上執行。
1.2 JavaScript簡介
JavaScript早期是由Netscape(網景)公司研發出來的一種在Netscape瀏覽器上執行的程序語言。它不僅包含了數組對象、數學對象,還包括一般語言所包含的操作數、控制流程等結構組件。用戶可以利用它設計出交互式的網頁內容,但這些網頁不能單獨執行,必須由瀏覽器或服務器執行。
開發JavaScript的最初動機是想要減輕服務器數據處理的負荷,能夠完成如在網頁上顯示時間、動態廣告、處理表單傳送數據等工作。隨着JavaScript所支持的功能日益增多,不少網頁編制人員轉而利用它來進行動態網頁的設計。Microsoft公司所研發的IE網絡瀏覽器在以前的版本中是不支持JavaScript語言的,但在IE 4.0之後也開始全面支持JavaScript,這使得JavaScript成爲兩大瀏覽器的通用語言。
從結構來說,JavaScript是一種基於對象和事件驅動的安全腳本語言。使用它的目的是與HTML超文本標記語言和Java腳本語言一起實現在一個Web頁面中鏈接多個對象,起到與Web客戶的交互作用,從而可以開發客戶端的應用程序等。
在上面已經提到JavaScript只能在HTML腳本中才能得以執行。那麼,如何在HTML語言中植入一個JavaScript腳本呢?以下是一個JavaScript腳本結構示例:
<script language="JavaScript">
……
</script>
Language指定了一個JavaScript語言。但現在也可以不用寫該屬性,因爲目前大部分瀏覽器都將其設爲默認值。一段JavaScript代碼可以放置於HTML中的任意部位,但多數情況下將其放於<HEAD>…</HEAD>區段中。因爲一些代碼可能需要在頁面裝載起始就開始運行。但如果願意,放置在任何位置都是可以的,甚至可以在HTML外部裝入一個JavaScript程序。如下例所示:
<script language="JavaScript" src="url">
……
</script>
這裏的url就是一個外部的JavaScript程序,在Netscape中只承認以後綴名爲.js的程序,而IE對這個要求就比較寬鬆,只要它符合MIME格式即可。如果有很多的頁面需要該段程序,只需編寫一個外部程序就可以在多個頁面中進行調用。當一句代碼結束後應在末尾添加一個分號,表示一個完整的句子,也可以將其省略,這樣並不影響程序的運行。在程序中的//和<!--……-->標記則是一段註釋的開始。Example.htm是JavaScript的一個簡單實例。代碼如下:
<html>
<head>
<title>這是一個JavaScrip程序的例子!</title>
</head>
<body>
<script language="JavaScript">
document.write("<h1>歡迎學習JavaScript!</h1>");
</script>
<img src="E:\javascript\001.gif">
</body>
</html>
Example.htm的運行結果如圖1-1所示。
圖1-1 JavaScript實例
1.3 JavaScript與Java的關係
常常會有人問到JavaScript與Java有什麼區別,甚至有人誤認爲JavaScript就是Java。雖然JavaScript與Java確實有一定的聯繫,但它們並不像我們所想象的那樣聯繫緊密。甚至可以肯定地說它們有很大的區別。JavaScript與Java的區別主要表現在以下幾個方面:
q JavaScript與Java是由不同的公司開發的不同產品。JavaScript是Netscape公司的產品,其目的是爲了擴展Netscape Navigator功能。Java是由Sun Microsystem公司開發的一種面向對象的程序設計語言,類似於C++,它需要多種編譯器和支持文件才能運行。
q JavaScript是基於對象的,它是一種腳本語言。它基於對象和事件驅動,因而它本身提供了非常豐富的內部對象供設計人員使用。而Java是面向對象的,即Java是一種真正的面向對象的語言,即使是開發簡單的程序也必須設計對象。
q JavaScript與Java在瀏覽器中所執行的方式不一樣。JavaScript是一種解釋性編程語言,其源代碼在發往客戶端執行之前不需經過編譯,而是將文本格式的字符代碼發送給客戶端,即JavaScript語句本身隨Web頁面一起下載下來,由瀏覽器解釋執行。而Java的源代碼在傳遞到客戶端執行之前,必須經過編譯,因而客戶端上必須具有相應平臺上的仿真器或解釋器,它通過編譯器或解釋器實現獨立於某個特定的平臺編譯代碼。
1.4 JavaScript的基本構成
JavaScript腳本語言同其他語言一樣,有它自身的基本數據類型、表達式和算術運算符以及程序的基本框架結構。JavaScript提供了5種基本的數據類型用來處理數字和文字,而變量則提供存放信息的地方,表達式則可以完成較複雜的信息處理。
1.4.1 基本數據類型
在JavaScript中的基本數據類型可分爲5種。
q 數值型:整數和浮點數統稱爲數值。所謂數值就是由數字及正負號所組成的數據類型,例如85或3.1415926等。
q 字符串型:是由多個單一的字符所組成的數據類型。在JavaScript中,用“"”或“'”括起來字符或數值,如"您好"、"學習'JavaScript' "等。
q 邏輯(布爾)型:用true或false來表示。
q 空(null)值:它是JavaScript的保留值。因爲JavaScript的大小寫敏感性,因此它不同於如Null或NULL等其他變量。需要特別注意的是,null既不等於“0”,也不等於“空字符串”。
q 未定義(undefined)值:該值的頂級屬性是未定義的,它也是一個保留值。在兩種情況下可能得到一個未定義的值,一種是根本不存在的對象,另一種就是雖然已經聲明,但卻沒有賦值。
JavaScript基本類型中的數據可以是常量,也可以是變量。由於JavaScript採用弱類型的形式,因而一個數據的變量或常量不必作聲明,而是在使用或賦值時確定其數據的類型。用戶可以先聲明該數據的類型,然後進行賦值。
1.4.2 變量
變量(Variable)又稱爲標識符,是對應到某個值的符號。因爲它所對應的值可能隨程序的進行而變化,所以稱爲變量。變量的名稱必須以大、小寫的英文字母或下劃線開頭,但不能以數字開頭,後面可以接數字或字母。由於JavaScript區分大小寫,所以A和a將被視爲兩個不同的變量。
1.變量定義
在JavaScript聲明一個變量時,可以使用以下方式實現:
var Up,Down,Left,Right;
也可以直接給它賦值,如下:
x=3;
2.變量的作用範圍
當在一個函數之外定義一個變量,那這個變量就叫做全局變量。全局變量可用於當前所有的文檔。在函數內部定義的變量則叫做局部變量,它只作用於函數內部。用戶可以通過指定窗口或框架的名字調用全局變量。例如,當一個框架文檔中定義了名爲phoneNumber的全局變量時,用戶在子框架中就可以使用parent.phoneNumber引用該變量。
1.4.3 常量
在JavaScript中用常量(Literals)來描述數值。常量是一些固定不變的值,不像變量那樣隨着程序的進行而變化,所謂常量就是保持不變的量。常量大致可分爲以下幾種:
1.整型常量
JavaScript的常量通常又稱字面常量,它是不能改變的數據。其整型常量可以使用十六進制、八進制和十進制表示其值。
2.數組常量
一個數組常量是零或更多表達式的列表,它包含在一對方括號內。當使用數組常量來創建一個數組時,它的元素和長度即由所指定的值進行初始化。下面來看一個具體的例子,該例題有3個元素,其長度爲3。
apple=["fruit","China","vitamin"]
不必在數組常量中指定所有的元素。如果在一行中輸入兩個逗號,它會自動爲沒有指定的元素留出空間,如下例所示:
God=["Belial",,"Angel"]
該數組包含兩個元素值和一個空元素,但要注意的是,如果把逗號放到數組的最後,那它將會被忽略不計。
3.布爾常量
布爾類型只有兩種值:true和false。它主要用來說明一種狀態或標誌,以說明操作流程。JavaScript與C++是不一樣的,C++可以用1或0表示其狀態,而JavaScript只能用true或false表示其狀態。
4.浮點數常量
一些浮點數組的例子就像後面給出的例子一樣,如3.1415926、-3.1E12、1e12和2E-12等。指數部分是在一個整數後跟一個“e”或“E”,它可以是一個有符號的數。一個浮點數組必須包含一個數字、一個小數點或“e(E)”。
5.整數
一個整數可以是十進制、十六進制和八進制數。一個十進制常量由一串數字序列組成,它的第一個數字不能爲0;如果第一個數字爲0,則表示它是一個八進制數;若爲0x,則表示它爲一個十六進 制數。
6.字符串常量
字符串常量是零或若干封裝在 “"”或“'”內的字符。如"ball"、'ball'、"6682"、"a line"等。可以在字符串常量中調用任何“字符對象”,而JavaScript會自動將字符串常量轉換爲一個臨時字符常量。
7.特殊字符
同C語言一樣,JavaScript中同樣有些是以反斜槓“/”開頭的不可顯示的特殊字符,通常稱爲控制字符。
1.4.4 表達式
表達式由常量、變量或運算符所組成,並生成一個單一值。如果一個語句返回一個值,那麼它就是一個表達式。該值可能是一個數值、字符串或一個邏輯值。表達式有兩種類型:一種是給變量賦一個值,另一種僅是一個簡單值。例如,表達式3+4簡單賦值爲7,3.14也是一個表達式;複雜一點的表達式如x=7,即給變量x賦值爲7。JavaScript的表達式有如下幾種類型:
q 數學表達式:計算值爲數字,如8.45。
q 字符串表達式:計算值爲一個字符串,如"computer"。
q 邏輯表達式:計算值爲true或false。
1.4.5 運算符
JavaScript具有一元和二元兩種運算符。二元運算符有兩個操作對象,如3*4;一元運算符只有一個操作對象,如i++或++i。另外,JavaScript還有三元運算符,而它則具有3個操作對象。
1.賦值運算符
賦值運算符是將右邊的操作數賦予左邊的操作對象,如x=y是將y的值賦給x。賦值運算符還具有簡寫形式,見表1-1。
表1-1 賦值運算符
運算符縮寫形式 |
含 義 |
x+=y |
x=x+y |
續表
運算符縮寫形式 |
含 義 |
x-=y |
x=x-y |
x*=y |
x=x*y |
x/=y |
x=x/y |
x%=y |
x=x%y |
x<<=y |
x=x<<y |
x>>=y |
x=x>>y |
x>>>=y |
x=x>>>y |
x&=y |
x=x&y |
x^=y |
x=x^y |
x|=y |
x=x|y |
2.比較運算符
比較運算符比較它的操作對象並返回一個邏輯值。操作對象既可以是數字也可以是字符串值。字符串的比較使用Unicode值按照字母順序進行,見表1-2。
表1-2 比較運算符
運 算 符 |
描 述 |
示 例 |
等號(==) |
如果操作對象相等返回true,如果兩個操作對象不爲同一類型,JavaScript將嘗試轉換它們爲一個適當的類型 |
5==var1 "5"==var1 5=='5' |
不等於(!=) |
兩個操作對象不相等,返回true |
var1!=8 var2!="5" |
絕對相等(===) |
如果操作對象相等並且類型相等,返回true |
5===var1 |
絕對不等(!==) |
如果操作對象不相等並且/或不是同一類型,返回true |
var1!=="5" 5!=='5' |
大於(>) |
如果左邊的操作對象大於右邊的操作對象,返回true |
var2>var1 |
大於或等於(>=) |
如果左邊的操作對象大於或等於右邊的操作對象,返回true |
var2>=var1 var1>=5 |
小於(<) |
如果左邊的操作對象小於右邊的操作對象,返回true |
var1<var2 |
小於或等於(<=) |
如果左邊的操作對象小於或等於右邊的操作對象,返回true |
var1<=var2 var2<=7 |
3.算術運算符
算術運算符將數字值(常量或變量)作爲操作對象並返回一個單一數字值。算術運算符見表1-3。
表1-3 算術運算符
運 算 符 |
描 述 |
實 例 |
%(取模) |
二進制運算符,返回整數除法的餘數 |
15%4返回3 |
++(增量) |
一元運算符,操作對象加1;如果是前置++i,返回增量後的值,如是後置i++,返回增量前的值 |
如i是7,++i返回8,而i++則返回7 |
--(減量) |
一元運算符,操作對象減1;如果是前置--i,返回減量後的值,如是後置i--,返回減量前的值 |
如i是7,--i返回6,而i--則返 回7 |
-(取反) |
一元運算符,返回操作數的反數 |
如i是7,那麼-i返回-7 |
4.按位運算符
按位運算符對操作數進行二進制數的位層運算,在比較兩個值之前先將它們轉化爲二進制數,見表1-4。
表1-4 按位運算符
運 算 符 |
用 法 |
描 述 |
按位與 |
a&b |
當兩個操作數的每個對應位都爲1時返回1 |
按位或 |
a|b |
當兩個操作數的對應位任意一個爲1時返回1 |
按位異或 |
a^b |
當兩個操作數的對應位其中一個不爲1且不全爲1時返回1 |
按位非 |
~a |
將操作數按位反轉 |
左移 |
a<<b |
將二進制數a左移b位,右邊補零 |
帶符號位右移 |
a>>b |
將二進制數a右移b位,丟棄移動位 |
首位0填充右移 |
a>>>b |
將二進制數a右移b位,丟棄移動位,並左邊補零 |
下面先來看一下按位邏輯運算符是用什麼方法進行工作的:先將操作數轉化爲二進制數並由0或1來表示,然後再將第一個操作數與第二個操作數之間按對應位進行操作,最後對運算符按對應位進行運算,結果按位配對。下面是一些按位運算的例子:
13&11結果爲9(1101&1011=1001)
13|11結果爲15(1101|1011=1111)
13^11結果爲6(1111^1001=0110)
按位移位運算符包括兩個運算對象:第一個是被移位的量,第二個指定第一個對象被移動的位的數目。移位運算符將操作數轉換爲二進制數,並返回同左邊類型相同的結果,見表1-5。
表1-5 移位運算符
運 算 符 |
描 述 |
實 例 |
<<(左移) |
運算符按指定的數目按位左移第一個操作數,左移多餘的位被丟棄,右邊補零 |
11<<2結果爲44,因爲1011左移2位將變爲101100,十進制爲44 |
續表
運 算 符 |
描 述 |
實 例 |
>>(帶符號位右移) |
運算符按指定的數目按位左移第一個操作數,多餘位被丟棄,最左邊的位移到左邊 |
11>>2結果爲2,因爲1011右移2位變爲10,十進制數爲2。同樣地,-11>>2結果爲-3,因爲符號位被保留了 |
>>>(零填充右移) |
運算符按指定的數目按位左移第一個操作數,多餘位被丟棄,從左邊補入0 |
13>>>2結果爲4,因爲1101右移2位爲11,十進制數爲3 |
5.邏輯運算符
通常邏輯運算符返回一個布爾值,但是“&&”和“||”運算符還可以返回其中一個指定的操作數的值,見表1-6。
表1-6 邏輯運算符
運 算 符 |
用 法 |
描 述 |
&& |
表達式1&&表達式2 |
邏輯與,如果它能轉換爲false,返回表達式1,否則返回表達式2;如果兩個表達式都爲真,&&返回true,否則返回false |
|| |
表達式1||表達式2 |
邏輯或,如果它能轉換爲true,返回表達式1,否則返回表達式2;如果兩個表達式都爲真,||返回true,否則返回false |
! |
!表達式 |
邏輯非,如果表達式能轉換爲true,將返回false,否則返回true |
6.字符串運算符
除了比較運算符外,用於字符串值的還有連結運算符,其將兩個字符串值連結在一起。例如"好好"+"學習"就返回"好好學習"。此外,還可以使用簡寫的方式(+=)來進行表達。
7.特殊運算符
JavaScript特殊運算符包括以下幾種類型:條件運算符、逗號運算符、delete、new、this、typeof、void。
當同一個命令行中存在多個運算符時,用戶必須考慮運算符的優先級。優先級指的是複合運算進行計算時的先後順序,對於所有的二元運算都是從左到右進行計算,當然也可以用圓括號來忽略優先級。表1-7給出了運算符及運算符類型。
表1-7 運算符及運算符類型
運算符類型 |
運 算 符 |
逗號 |
, |
賦值 |
=、+=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、^=、|= |
條件 |
?: |
邏輯或 |
|| |
邏輯與 |
&& |
按位或 |
| |
續表
運算符類型 |
運 算 符 |
按位異或 |
^ |
按位與 |
& |
等於/不等於 |
==、!= |
比較 |
< <=、> >= |
按位移位 |
<<、>>、>>> |
加/減 |
+、- |
乘/除 |
*、/、% |
非/增減量 |
!、~、-、+、++、--、typeof、void、delete |
調用 |
( ) |
創建 |
new |
成員 |
. [] |
1.5 JavaScript的基本語法
JavaScript的語法同其他編程語言類似,主要包括條件選擇、循環、跳出3大類。下面將介紹構成這些語法的常用語句。
1.5.1 if條件選擇語句
if…else語句,如果條件爲true,則執行if段語句;若爲false,則執行else段語句。用法如下:
if(條件判定)
{
……語句1(條件爲true時);
}
else
{
……語句2(條件爲false時);
}
if…else語句條件的結果值可以是true或false的JavaScript表達式。表達式可以是任何可執行的JavaScript語句,還可以在任意層被嵌套。具體實例如下面的IF.htm所示:
<script language="JavaScript">
function checkData ()
{
if (document.form1.three.value.length==3)
alert("OK!有效!");
else
{
alert("請輸入三個字符,“"+document.form1.three.value+"”無效!");
return false
}
}
</script>
<form name="form1">
<center>
請輸入字符:<input type="text"name="three"onChange="checkData()">
</center>
</form>
在IF.htm文件的文本框內輸入3個字符,單擊鼠標左鍵,就會彈出一個警告框,如圖1-2所示。否則就會彈出無效對話框,如圖1-3所示。
圖1-2 有效的輸入 圖1-3 無效的輸入
1.5.2 switch選擇語句
switch語句允許程序給表達式求值,並用case標記來匹配表達式可能的值。如果匹配成立,程序將執行相應的語句。具體用法如下:
switch(表達式)
{
case:語句
break;
case:語句
break;
……
default:語句
}
下面來看一下switch語句執行的流程。如果case的值等於表達式的值,則執行它相應的語句;否則繼續執行,直到遇到一個break語句,或者switch語句結束。這就是說如果沒有使用break語句,那麼將會出現多個case一起被執行的情況。如果沒有case等於表達式的值,則跳轉到default;如果在default也沒有的情況下,則跳轉到最後一步,繼續執行switch代碼末尾的語句。下面就來看一個switch語句的例題。
<script language="JavaScript">
{
for(i=0;i<6;i++)
switch(i)
{
case 0:
document.write("i is 0.<br>");
break;
case 1:
document.write("i is 1.<br>");
break;
case 2:
document.write("i is 2.<br>");
break;
case 3:
document.write("I is 3.<br>");
break;
default:
document.write("i is greater than 3.");
}
}
</script>
在上面的實例中,switch語句共執行了5次,每執行一次case就會換行。該語句一共執行了5次,但只有4個case,所以default被執行了兩次,如圖1-4所示。
圖1-4 switch選擇語句
1.5.3 do…while語句
do…while將對語句進行循環執行,直到條件爲false爲止。用法如下:
do
{
語句
}
while(條件判斷)
首先執行一個語句,然後重複循環執行該語句,直到條件表達式爲false。下面來看一個do…while語句的實例。如下:
<script language="JavaScript">
var i=0;
do
{
i+=1;
document.write (i+"<br>");
}
while (i<10);
</script>
上面這個例子實現了從1~10的輸出,do…while與while循環語句實現的結果很相似,所以一般不用do…while語句,而使用while循環語句。程序的執行結果如圖1-5所示。
圖1-5 do…while語句
1.5.4 while循環語句
while語句只執行一個語句,直到指定的條件爲false爲止。其用法如下:
while(條件)
{
語句
}
該語句與 do…while語句不同的是,它將在語句開始執行時檢查條件是否爲true,如果條件爲false,它將不會執行下面的語句。下面就來看一個while循環語句的例子。
<sript language="JavaScript">
var loop=0;
while (loop<5)
{
document.write("<h1> while循環語句</h1>");
loop++;
}
</script>
在上例中將字體循環5次之後,退出程序執行,如圖1-6所示。
圖1-6 while循環語句
1.5.5 for循環語句
for語句執行語句循環,直到條件爲false爲止。用法如下:
for([初始表達式];[條件];[增量表達式])
{
語句
}
for語句的初始表達式由一個表達式構成,該表達式只在執行循環前被執行一次。條件是一個布爾表達式,如果值爲true,則下面的語句被執行;若爲false,則循環結束。增量表達式在每次循環完後執行。語句是條件的值爲true時要執行的語句,它可以是複合語句。下面就來看一個for語句的例子。
<script language="JavaScript">
for(i=0;i<10;i++)
{
document.write("<h2><font color=red>for循環語句例題演示</font></h2>");
}
</script>
在上例中將字體循環10次之後,退出程序執行,如圖1-7所示。從這個例子中可以看出,for循環語句與while循環語句很相似,都是完成語句的循環。
圖1-7 for循環語句
1.5.6 break語句與continue語句
如何在執行程序時,讓程序停止在我們想要停止的地方?如果要想繼續執行,又該如何解決?下面就來看一下解決這個問題的break語句和continue語句。
1.break語句
用break語句來中止一個循環,如switch語句。當在一個while、do…while、for或switch語句中,break就會立即終止最裏層的循環或將控制權交給下面的語句執行。下面來看一個具體的實例。
<script language="JavaScript">
function BreakTest()
{
var i=1;
while(i<10)
{
document.write (i);
if(i==5)
break;
i++;
}
return("<h1>"+i+"</h1>");
}
document.write(BreakTest());
</script>
上面的例子顯示的是從1~10,而在中間使用了break之後,就中斷了正常的循環。因爲i等於5,所以在輸出到5之後就改爲執行break語句,終止當前的循環,最後輸出爲標題1的i值,如圖1-8 所示。
圖1-8 break語句
2.continue語句
continue語句用於重新開始一個while、do…while或for語句。其用法如下:
continue [label];
其中[label]是可選的,它是指定斷點處語句的標籤。
執行continue語句會停止當前的循環,並從循環的開始處繼續程序流程。這樣對不同的循環類型有不同的影響:while和do…while循環檢查它們的條件,如果條件爲true,則再次執行循環;for循環執行它們的遞增表達式,如果測試表達式爲true,則再次執行循環。下面是一個關於continue的例子。
<script language="JavaScript">
function skip()
{
var s=" ",i=0;
while(i<10)
{
i++;
document.write ("<b>"+i+"</b>");
if(i==5)
{
continue;
}
s+=i;
}
document.write ("<br>");
return("<b>"+s+"</b>");
}
document.write (skip());
</script>
從圖1-9中可以看出第二行比第一行少了一個5,這就是continue與break的不同之處。break是在到達指定的條件之後就不再繼續執行程序,而continue則是在到達指定的條件之後繼續執行下面的程序,直到完成爲止。第一行中的10個數字是逐個輸出變量i的值,而第二行是在執行了continue之後跳過了5,再輸出字符串s的值,所以比第一行少一個字符5。
圖1-9 continue語句
1.6 JavaScript的函數調用
函數是JavaScript中最基本的建構成員。函數是一個JavaScript過程,執行一個特定的任務。使用一個函數前,必須對它進行定義,然後在腳本中對它進行調用。
1.6.1 函數的定義與調用
函數的定義是由一系列的JavaScript關鍵字所組成的,主要包括函數的名稱、函數的參數、函數的JavaScript語句。參數包含在由逗號分開的圓括號內,JavaScript語句包含在大括號內,該語句還可以調用另外的一個或多個函數。
通常可以在文檔的頭部定義函數,以便當文檔被裝載時函數首先載入;否則,有可能在文檔正在被載入時,用戶已經觸發了一個事件而調用了一個還沒有定義的函數,導致一個錯誤的產生。而一個函數的原型應該像下面的語句一樣:
function square(number)
{
return number * number;
}
調用函數就是使用當前文檔中所定義的函數,或者調用另一個窗口或框架定義的函數。調用時需要用指定的參數來執行一個特殊的行爲。一個函數還可以進行遞歸,也就是說自已調用自己。
1.6.2 全局變量與局部變量
JavaScript變量可以在使用之前先進行聲明,並對其賦值。通過使用Var關鍵字對變量作聲明,而對變量作聲明的最大好處就是能及時地發現程序中的錯誤。因爲JavaScript採用的是動態編譯,而動態編譯是不易發現代碼中的錯誤的,特別是在變量命名這方面。
對於變量還有另一個重要的屬性,那就是變量的作用域。在JavaScript中同樣有全局變量和局部變量之分。全局變量是定義在函數之外的所有變量,其作用範圍是整個函數。而局部變量是定義在函數體之內的,所以只對其所在的函數體有效。
1.6.3 可變參數的函數
函數的arguments是返回一個數組,它包含了傳遞給當前執行函數的每個參數。如arguments[i]或functionName.arguments[i]。在這裏的i是一個序列數,從零開始,因此傳遞給函數的第一個參數應當是arguments[0],arguments的整個長度由arguments.length來指定。
通過arguments的屬性,函數可以很好地處理可變數量的參數。當不知道有多少個參數將傳遞給函數時,arguments就會發揮它的功能,可以用arguments.length決定實際傳遞給函數的參數數目,然後用arguments數組嘗試每個參數。
1.6.4 預定義函數
在JavaScript中共包含以下幾個預定義函數。
1.eval函數
eval函數對作爲數字表達式的一個字符串進行求值。其語法如下:
eval(expr)
此處的expr是一個被求值的字符串參數。如果該字符串是一個表達式,那麼eval求該表達式的值;如果該參數代表一個或多個JavaScript語句,則eval執行這些語句。eval函數可以用來把一個日期從一種格式轉換爲數值表達式或數字。
2.isFinite函數
isFinite函數是計算一個參數以確定它是否是一個有限數值。其語法如下:
isFinite(number)
此處的number是一個數值。如果參數爲非數字、正無窮數或負無窮數,該函數返回false,否則返回true。
3.isNaN函數
isNaN函數是計算一個參數以確定它是否爲NaN(非數字)。其語法如下:
isNaN(testValue)
此處的testValue是想要計算的值。若結果爲NaN,則返回true,否則爲false。
4.parseInt和parseFloat函數
這兩個parse函數將字符串參數轉換爲一個數值。其語法如下:
parseFloat(str)
parseInt(str[,radix])
parseFloat分析它的字符串參數str,並嘗試將其轉換爲一個浮點數,如果它處理的字符不是符號(+或-)、數字、十進制小數點或指數,那麼返回值到該位置停止,而忽略後面所有的字符;如果第一個字符不能轉換爲一個數值,那它將返回NaN。
parseInt分析它的第一個參數str,並基於指定的基數radix或底數之上返回一個整數。例如,若基數爲10則將其轉化爲十進制,爲8則轉化爲八進制,爲16則轉化爲十六進制。如果基數省略或它與首字符相矛盾時,JavaScript假定基數是基於字符串的第一個字符,當第一個字符不能轉換爲基於基數的數字時,它將返回NaN。
5.Number和String函數
Number和String函數是將一個對象轉換爲一個數字或字符串。其語法如下:
Number(objRef)
String(objRef)
此處的objRef是一個對象的引用。下面的例子將一個Date對象轉換成爲一個可讀的字符串。
D=new Date (430054663215)
<!---下面它將返回爲字符串:"Thu Aug 18 19:37:43 UTC+0800 1983"-->
x=String(D)
6.escape和unescape函數
escape和unescape函數是將字符串進行編碼或解碼。其語法如下:
escape(string)
unescape(string)
escape函數將字符串轉換爲基於ISO Latin字符集的十六進制ASCII碼。這個函數不與任何其他對象關聯。但它實際上是JavaScript語言的一個固有部分,對於字母、數字以及字符將返回它們本身,而對於符號則返回它們的ASCII碼,其形式爲%xxx。例如語句document.write(escape(Hi!"))的返回結果爲Hi%21。
unescape函數是返回一個基於其ASCII碼值的字符,即對其進行解碼。
1.7 JavaScript的對象
JavaScript是基於對象的簡單程序。對象由JavaScript的變量或其他對象的屬性、方法所組成的集合。方法是作爲某個對象成員的函數,屬性是作爲對象成員的一個值、數組或對象的形式。下面就先來了解一下對象和它的屬性。
1.7.1 對象的基本概述
在JavaScript中,對象是對客觀事物或事物之間關係的描述。JavaScript中可以使用以下幾種對象:
q JavaScript內置對象,如Date、Math及String。
q 用戶自定義的對象。
q 由瀏覽器根據頁面內容自動提供的對象。
q 服務器上固有的對象。
JavaScript中的對象由屬性和方法兩個基本元素構成。屬性成員是對象的數據,方法成員是對數據的操作。在JavaScript中還提供了幾個對象處理的語句,例如this、for…in、with和new。
1.7.2 對象屬性
一個JavaScript對象具有各種各樣的屬性。可以用下面方法來訪問一個對象的屬性:
objectName.propertyName
需要注意的是,對象名和屬性名都對大小寫很敏感。用戶可以通過給屬性賦值來定義一個屬性。例如,假設有一個對象名爲Food,可用如下的方法來訪問其屬性:
Food.make="KFC";
Food.producing area="China";
Food.year=2005;
數組是用單一的變量名關聯數值的一個序列。在JavaScript中,屬性和數組是密切相關的。事實上,它們具有不同的界面和相同的數據結構,因此也可以像下面所給出的方法一樣來訪問Food對象的 屬性。
Food["make"]="KFC";
Food["producing area"]="China";
Food["year"]=2005;
這類數組是一個關聯數組,因爲每個索引元素都通過一個字符串值關聯。爲了舉例說明它是如何工作的,下面的函數顯示對象的屬性,並把對象和對象名作爲參數傳遞給函數。
function show_props(obj, obj_name)
{
var result=" ";
for(var i in obj)
result+=obj_name+"."+i+"="+obj[i]+"\n";
return result;
}
如果函數調用show_props(Food,"Food"),將返回下面的結果:
Food.make=KFC;
Food.producing area=China;
Food.year=2005;
1.7.3 創建對象
從JavaScript 1.2開始,就可以用對象初始化程序創建對象。另外,用戶也可以首先創建一個構造函數,並用new運算符來創建該對象的實例。
1.對象初始化程序
除了用構造函數來創建對象外,還可以用對象初始化程序來創建對象。對象初始化程序技術是從C++中引用來的。它的用法如下:
objectName={property1:value1,property2:value2,...,propertyN:valueN}
這裏objectName是新對象的名字。每個property是一個標識符,可能是一個名字、數字或字符串直接量。每一個value是賦予屬性property值的表達式,objectName和賦值均爲可選項。下面的例子創建了3個屬性的對象myBenz。注意,屬性engine本身是具有它自己的兩個屬性對象。
myBenz={color:"silvery white",wheels:4,engine:{cylinders:4,size:3.0}}
2.使用構造函數
除了上面所說的用對象初始化程序來創建對象外,還可以用構造函數來創建對象。創建一個函數來指定對象的名字、屬性和方法來定義對象類。假設需要創建的對象類爲car,它具有的屬性包括make、model、year和color,可以按照以下方法來實現:
function car(make,model,year)
{
this.make=make;
this.model=model;
this.year=year;
}
現在就可以創建一個對象mycar,如下:
mycar=new car("Benz","S600",2000);
用戶還可以給先前定義的對象添加一個屬性,如mycar.color="silvery white",它並不會影響其他的同類對象。
3.索引對象屬性
在JavaScript中,對象也是一個數組。用戶可以按名稱來引用一個對象的屬性和方法,也可以按其數組下標索引來引用。如果某文檔有兩個表單,其中第二個表單名爲myForm。下面的方法是等價的:
document.myForm;
document.forms[1]; <!--[1]是HTML源順序中屬性forms的索引-->
document.forms["myForm"];
4.爲對象類定義屬性
可以用prototype屬性在先前定義的對象類中加入一個屬性,它可以被所有指定的對象類所共享。下面的代碼爲car類所有的對象添加一個color屬性,併爲car1的color屬性賦值。
car.prototype.color=null;
car1.color="black";
5.定義方法
方法是對象的集合,可以像定義標準函數一樣定義一個方法。方法就是賦給某個對象的一個函數,還可以在對象構造函數中包含方法定義來定義對象類的方法。例如,下面的例子:
function displayCar()
{
var result="A Beautiful"+this.year+" "+this.make+" "+this.model;
pretty_print(result);
}
對於前面定義car的對象類,就可以如下來調用car對象類中每個對象的displayCar方法:
car1.displayCar()
car2.displayCar()
6.使用對象引用
JavaScript有一個特殊的關鍵字this,用它可以在一個方法中來引用當前的對象。當其用於form屬性時,this關鍵字引用當前對象的父系表單。如下例,當用戶按下按鈕時,text對象內文本框內容將以其父系表單的名字myForm來代替原值Benz。
<form name="myForm">
Form name:<input type="text" name="text1" value="Benz">
<input name="button1" type="button" value="Show Form Name"
onClick="this.form.text1.value=this.form.name">
</form>
7.刪除對象
若想刪除一個對象,可以用delete運算符來刪除。如下例所示:
myobj=new Number();
delete myobj; <!--刪除對象並返回true-->
1.7.4 使用對象
本節就來講述一下JavaScript的對象並解釋如何來使用它們。通過本節的學習將會對對象有更加深入的瞭解。
1.關鍵對象
window對象是所有對象的“父”對象,可以在JavaScript應用程序中創建多個窗口。frame對象由框架文檔中的FRAME標記所定義,frame對象同window對象具有相同的屬性和方法,所不同的是它們的顯示方式不同。下面列舉了window對象一些很有用的方法。
q open和close:打開和關閉瀏覽器窗口,可以指定窗口的尺寸、內容以及是否有按鈕條、地址框等屬性。
q alert:顯示一個警告對話框。
q confirm:顯示一個有OK和Cancel按鈕的確認對話框。
q prompt:顯示一個輸入值文本域的提示對話框。
q blur和focus:在窗口中移去或得到一個焦點。
q scrollTo:捲動窗口到指定的座標。
q setInterval:在每個指定時間段對一個表達式賦值或調用一個函數。
q setTimeout:在指定的一段時間後對一個表達式賦值或調用一個函數。
在每一頁都有一個document對象。因爲它有write和writeln兩個方法產生HTML,因此它也是一個最有用的對象之一。document對象是文檔頁Anchor、Applet、Area、Form、Image、Layer、Link和Plugin對象的父對象。而在文檔內的每一個表單都會產生一個Form對象,又因爲一個文檔可以包含多個表單,因此Form對象被存儲到一個叫forms的數組中,第一個表單爲forms[0],第二個爲forms[1],依此類推。如下面給出的例子就可以來引用文檔內第一個表單的第一個元素。
document.forms[0].elements[0]
location對象具有基於當前URL的屬性,例如hostname屬性是當前文檔服務器和域名。它有兩個方法:一種是reload強制窗口重載當前文檔;另一種是replace 從當前歷史記錄裝載指定的URL。
而history對象則包含了客戶曾經訪問過的URL列表,可以用current、next previous屬性訪問當前、下頁、前頁的歷史記錄,還可以用history數組訪問別的歷史記錄值。也可以用go方法來重定向客戶到任何歷史記錄,例如下面的代碼裝載客戶倒數第二個歷史記錄。
history.go(-2)
在navigator對象中包含了瀏覽器的版本信息,如appName屬性指定瀏覽器的名字,appVersion屬性指定瀏覽器的版本。navigator有兩個方法:一是javaEnabled,指定Java是否有效;二是preference,可以用一個簽名的腳本獲取或設置各種用戶參數。
2.JavaScript映射及HTML佈局
JavaScript對象屬性值是基於HTML文檔的內容,可以稱爲映射(reflection),因爲屬性值映射到了HTML中。爲了更好地理解JavaScript映射,就需要了解瀏覽器是如何進行頁面佈局的。通常瀏覽器是從HTML文件的頂行開始往下讀入並執行其語句,並順序將其顯示到屏幕上。因爲有這個“向下”的過程,僅當讀到它時JavaScript纔對其映射。例如,只有當定義了一個表單後,JavaScript纔將表單元素視爲其對象,否則將會出錯。
同樣地,一旦頁面佈局已經發生,設置屬性並不會影響它本來的值或外觀。在document屬性章節中,我們用了一個關於文檔的標題的例子,但是卻不能更改文檔的標題,如果在JavaScript代碼中寫入以下內容:
document.title="Document屬性"
那麼就會得到一個錯誤信息。然而也有例外,也可以動態地改變表單元素的值。另外,用事件處理器也可以在佈局完成後改變少數的其他屬性,如document.bgColor。
3.document對象
document對象是JavaScript的基本對象之一,因此一個HTML文檔中大多數都是它的屬性。下面就來看一個關於document屬性的實例。
document.myform.Button1.value=document.title
上面這個例子是在頁面中出現一個按鈕,當用鼠標單擊之後,按鈕上的字就會變成文檔的標題。而document.title的意思就是獲取文檔的標題,並將值“Document屬性”賦予按鈕的value屬性中去。
4.write方法
文檔的write方法顯示輸出信息,在腳本中可以做所有在普通HTML不能完成的工作,例如可以有條件地顯示正文或使用變量。因此write方法是最常用的JavaScript方法之一。還可以用字符串的連結運算符將幾個字符串連結爲一個。
<head>
<script language="JavaScript">
function bar()
{
document.write("<hr>");
}
function output(headLevel,headText)
{
document.write("<H", headLevel, ">", headText, "</H",headLevel, ">");
}
</script>
</head>
<body>
<script language="JavaScript">
bar();
output(1,"用JavaScript產生動態HTML");
{
document.write("<hr>");
}
</script>
</body>
上面這個例題演示的是使用JavaScript的write方法來實現動態的HTML,並在文本的上下方各加一條水平線,如圖1-10所示。
圖1-10 write方法
1.7.5 其他內部對象
1.Array對象
JavaScript可以使用預定義的Array對象及其方法提供對創建任何數據類型的數組的支持。數組是一套數值的序列,它由一個名字和索引所組成。創建數組有兩種方法來定義一個數組。具體如下:
arrayObjectName=new Array(element0,element1,…,elementN)
arrayObjectName=new Array(arrayLength)
這裏arrayObjectName既可以是存在的對象,也可以是一個新的對象。而element0,element1,…,elementN是數組元素的值,arrayLength則是數組初始化的長度。
賦值及引用可以使用以下方法對數組進行賦值:
emp[0]="apple"
也可以在創建數組時給它賦值,如下:
emp=new Array(apple,orange,banana)
所有的數組元素第一個索引都是從0開始的,引用上面的第一個元素應當使用以下的格式:
emp[0]
2.Boolean對象
Boolean對象是Boolean數據類型的包裝器。每當Boolean數據類型轉換爲Boolean對象時,JavaScript都隱含地使用Boolean對象。可以用下面的語法來創建一個Boolean對象:
booleanObjectName=new Boolean(value)
不要將Boolean的原始值和Boolean對象的true和false值相混淆。可選的value參數是新對象的初始Boolean值。如果該值省略,或者爲false、undefined、null、NaN以及空字符串,則該Boolean對象的初始值爲false;否則,初始值爲true。例如:
var b=new Boolean(false);
if (b) <!--該表達式爲true-->
3.Date對象
JavaScript沒有時間數據類,但可以用Date對象及其方法來取得日期和時間。Date對象有許多方法來設置、提取和操作時間,它沒有任何屬性。JavaScript處理時間的方法類似於Java。Date對象的範圍爲相對於1970年1月1日的前後100000000天。創建一個Date對象的方法如下:
dateObjectName=new Date([parameters])
dateObjectName是創建的Date對象名,它可以是一個新對象或已存在對象的屬性,parameters可以是空白或者用字符串描述。
4.Function對象
預定義的Function對象指定一個JavaScript字符串碼,它可以像函數一樣進行編譯。其用法如下:
functionObjectName=new Function([arg1,arg2,...argn],functionBody)
functionObjectName是一個變量名或一個已存在的對象屬性。functionBody是包含調用該函數時被執行的JavaScript代碼塊的字符串。下面的代碼將一個函數賦予變量setBGColor,該函數設置了當前文檔的背景色。
var setbgColor=new Function("document.bgColor='antiquewhite' ")
5.Math對象
預定義的Math對象具有數學常量和函數的屬性和方法。同樣地,標準的數學函數也是Math對象的方法。與別的對象不同,不能自已創建一個Math對象,所有的Math對象都是預定義的,可以通過以下方法來使用多個的數學常量和方法。
with(Math)
{
a=PI*r*r;
y=r*sin(theta);
x=r*cos(theta);
}
6.Number對象
Number對象代表數值數據類型和提供數值常數的對象。Number對象最主要的用途是將其屬性集中到一個對象中,以及使數字能夠通過toString方法轉換爲字符串。
7.String對象
String對象可用於處理或格式化文本字符串,以及確定和定位字符串中的子字符串。不要將它同字符串常量相混淆。用戶可以在一個字符串常量中調用任何String對象方法,JavaScript自動將字符串常量轉換爲一個臨時的String對象並調用其方法,然後丟棄該臨時的String對象。用戶也可以在一個字符串常量中使用String.length屬性。