JavaScript 是使用“對象化編程”的,,或者叫“面向?qū)ο缶幊?#8221;的,。所謂“對象化編程”,意思是把 JavaScript
能涉及的范圍劃分成大大小小的對象,,對象下面還繼續(xù)劃分對象直至非常詳細(xì)為止,所有的編程都以對象為出發(fā)點,,基于對象,。小到一個變量,大到網(wǎng)頁文檔,、窗口甚至屏幕,,都是對象。這一章將“面向?qū)ο?#8221;講述
JavaScript 的運(yùn)行情況,。 對象的基本知識
對象是可以從
JavaScript“勢力范圍”中劃分出來的一小塊,,可以是一段文字、一幅圖片,、一個表單(Form)等等,。每個對象有它自己的屬性、方法和事件,。對象的屬性是反映該對象某些特定的性質(zhì)的,,例如:字符串的長度、圖像的長寬,、文字框(Textbox)里的文字等等,;對象的方法能對該對象做一些事情,,例如,表單的“提交”(Submit),,窗口的“滾動”(Scrolling)等等,;而對象的事件就能響應(yīng)發(fā)生在對象上的事情,例如提交表單產(chǎn)生表單的“提交事件”,,點擊連接產(chǎn)生的“點擊事件”,。不是所有的對象都有以上三個性質(zhì),有些沒有事件,,有些只有屬性,。引用對象的任一“性質(zhì)”用“<對象名>.<性質(zhì)名>”這種方法。
基本對象 現(xiàn)在我們要復(fù)習(xí)以上學(xué)過的內(nèi)容了——把一些數(shù)據(jù)類型用對象的角度重新學(xué)習(xí)一下,。 Number
“數(shù)字”對象,。這個對象用得很少,作者就一次也沒有見過,。不過屬于“Number”的對象,,也就是“變量”就多了。
屬性 MAX_VALUE
用法:Number.MAX_VALUE,;返回“最大值”,。 MIN_VALUE
用法:Number.MIN_VALUE;返回“最小值”,。 NaN 用法:Number.NaN 或
NaN,;返回“NaN”。“NaN”(不是數(shù)值)在很早就介紹過了,。 NEGATIVE_INFINITY
用法:Number.NEGATIVE_INFINITY,;返回:負(fù)無窮大,比“最小值”還小的值,。 POSITIVE_INFINITY
用法:Number.POSITIVE_INFINITY,;返回:正無窮大,比“最大值”還大的值,。 方法 toString()
用法:<數(shù)值變量>.toString(),;返回:字符串形式的數(shù)值。如:若 a == 123,;則 a.toString() ==
'123',。
String
字符串對象。聲明一個字符串對象最簡單,、快捷,、有效、常用的方法就是直接賦值,。
屬性 length
用法:<字符串對象>.length,;返回該字符串的長度,。 方法 charAt()
用法:<字符串對象>.charAt(<位置>);返回該字符串位于第<位置>位的單個字符,。注意:字符串中的一個字符是第 0
位的,,第二個才是第 1 位的,最后一個字符是第 length - 1 位的,。 charCodeAt()
用法:<字符串對象>.charCodeAt(<位置>),;返回該字符串位于第<位置>位的單個字符的 ASCII
碼。 fromCharCode() 用法:String.fromCharCode(a, b,
c...),;返回一個字符串,,該字符串每個字符的 ASCII 碼由 a, b, c... 等來確定。 indexOf()
用法:<字符串對象>.indexOf(<另一個字符串對象>[,
<起始位置>]),;該方法從<字符串對象>中查找<另一個字符串對象>(如果給出<起始位置>就忽略之前的位置),,如果找到了,就返回它的位置,,沒有找到就返回“-1”,。所有的“位置”都是從零開始的。 lastIndexOf()
用法:<字符串對象>.lastIndexOf(<另一個字符串對象>[, <起始位置>]),;跟 indexOf()
相似,,不過是從后邊開始找。 split()
用法:<字符串對象>.split(<分隔符字符>),;返回一個數(shù)組,,該數(shù)組是從<字符串對象>中分離開來的,<分隔符字符>決定了分離的地方,,它本身不會包含在所返回的數(shù)組中,。例如:'1&2&345&678'.split('&')返回數(shù)組:1,2,345,678。關(guān)于數(shù)組,,我們等一下就討論。 substring()
用法:<字符串對象>.substring(<始>[,
<終>]),;返回原字符串的子字符串,,該字符串是原字符串從<始>位置到<終>位置的前一位置的一段。<終> -
<始> =
返回字符串的長度(length),。如果沒有指定<終>或指定得超過字符串長度,,則子字符串從<始>位置一直取到原字符串尾。如果所指定的位置不能返回字符串,,則返回空字符串,。 substr()
用法:<字符串對象>.substr(<始>[,
<長>]);返回原字符串的子字符串,,該字符串是原字符串從<始>位置開始,,長度為<長>的一段,。如果沒有指定<長>或指定得超過字符串長度,則子字符串從<始>位置一直取到原字符串尾,。如果所指定的位置不能返回字符串,,則返回空字符串。 toLowerCase()
用法:<字符串對象>.toLowerCase(),;返回把原字符串所有大寫字母都變成小寫的字符串,。 toUpperCase()
用法:<字符串對象>.toUpperCase();返回把原字符串所有小寫字母都變成大寫的字符串,。
Array
數(shù)組對象,。數(shù)組對象是一個對象的集合,里邊的對象可以是不同類型的,。數(shù)組的每一個成員對象都有一個“下標(biāo)”,,用來表示它在數(shù)組中的位置(既然是“位置”,就也是從零開始的啦),。 數(shù)組的定義方法:
var <數(shù)組名> = new
Array();
這樣就定義了一個空數(shù)組,。以后要添加數(shù)組元素,就用:
<數(shù)組名>[<下標(biāo)>] =
...;
注意這里的方括號不是“可以省略”的意思,,數(shù)組的下標(biāo)表示方法就是用方括號括起來,。 如果想在定義數(shù)組的時候直接初始化數(shù)據(jù),請用:
var <數(shù)組名> = new Array(<元素1>, <元素2>,
<元素3>...);
例如,,var myArray = new Array(1, 4.5, 'Hi');
定義了一個數(shù)組 myArray,,里邊的元素是:myArray[0] == 1; myArray[1] == 4.5; myArray[2] ==
'Hi'。 但是,,如果元素列表中只有一個元素,,而這個元素又是一個正整數(shù)的話,這將定義一個包含<正整數(shù)>個空元素的數(shù)組,。 注意:JavaScript只有一維數(shù)組,!千萬不要用“Array(3,4)”這種愚蠢的方法來定義
4 x 5
的二維數(shù)組,或者用“myArray[2,3]”這種方法來返回“二維數(shù)組”中的元素,。任意“myArray[...,3]”這種形式的調(diào)用其實只返回了“myArray[3]”,。要使用多維數(shù)組,請用這種虛擬法:
var myArray = new Array(new Array(), new Array(), new Array(),
...);
其實這是一個一維數(shù)組,,里邊的每一個元素又是一個數(shù)組,。調(diào)用這個“二維數(shù)組”的元素時:myArray[2][3] =
...;
屬性 length
用法:<數(shù)組對象>.length;返回:數(shù)組的長度,,即數(shù)組里有多少個元素,。它等于數(shù)組里最后一個元素的下標(biāo)加一。所以,想添加一個元素,,只需要:myArray[myArray.length]
= ...,。 方法 join()
用法:<數(shù)組對象>.join(<分隔符>);返回一個字符串,,該字符串把數(shù)組中的各個元素串起來,,用<分隔符>置于元素與元素之間。這個方法不影響數(shù)組原本的內(nèi)容,。 reverse()
用法:<數(shù)組對象>.reverse(),;使數(shù)組中的元素順序反過來。如果對數(shù)組[1, 2, 3]使用這個方法,,它將使數(shù)組變成:[3, 2,
1],。 slice() 用法:<數(shù)組對象>.slice(<始>[,
<終>]);返回一個數(shù)組,,該數(shù)組是原數(shù)組的子集,,始于<始>,終于<終>,。如果不給出<終>,,則子集一直取到原數(shù)組的結(jié)尾。 sort()
用法:<數(shù)組對象>.sort([<方法函數(shù)>]),;使數(shù)組中的元素按照一定的順序排列,。如果不指定<方法函數(shù)>,則按字母順序排列,。在這種情況下,,80
是比 9
排得前的。如果指定<方法函數(shù)>,,則按<方法函數(shù)>所指定的排序方法排序,。<方法函數(shù)>比較難講述,這里只將一些有用的<方法函數(shù)>介紹給大家,。 按升序排列數(shù)字:
function sortMethod(a, b) { return a -
b; }
myArray.sort(sortMethod);
按降序排列數(shù)字:把上面的“a - b”該成“b
- a”,。 有關(guān)函數(shù),請看下面,。
Math
“數(shù)學(xué)”對象,,提供對數(shù)據(jù)的數(shù)學(xué)計算。下面所提到的屬性和方法,,不再詳細(xì)說明“用法”,大家在使用的時候記住用“Math.<名>”這種格式,。
屬性 E 返回常數(shù) e
(2.718281828...),。 LN2 返回 2 的自然對數(shù) (ln 2)。 LN10
返回 10 的自然對數(shù) (ln 10)。 LOG2E 返回以 2 為低的 e 的對數(shù)
(log2e),。 LOG10E 返回以 10 為低的 e 的對數(shù) (log10e),。 PI
返回π(3.1415926535...)。 SQRT1_2 返回 1/2
的平方根,。 SQRT2 返回 2
的平方根,。 方法 abs(x) 返回 x
的絕對值。 acos(x) 返回 x 的反余弦值(余弦值等于 x
的角度),,用弧度表示,。 asin(x) 返回 x 的反正弦值。 atan(x)
返回 x 的反正切值,。 atan2(x, y) 返回復(fù)平面內(nèi)點(x,
y)對應(yīng)的復(fù)數(shù)的幅角,,用弧度表示,其值在 -π 到 π 之間,。 ceil(x) 返回大于等于 x
的最小整數(shù),。 cos(x) 返回 x 的余弦。 exp(x) 返回 e 的 x
次冪 (ex),。 floor(x) 返回小于等于 x 的最大整數(shù),。 log(x)
返回 x 的自然對數(shù) (ln x)。 max(a, b) 返回 a, b
中較大的數(shù),。 min(a, b) 返回 a, b 中較小的數(shù),。 pow(n, m)
返回 n 的 m 次冪 (nm)。 random() 返回大于 0 小于 1
的一個隨機(jī)數(shù),。 round(x) 返回 x 四舍五入后的值,。 sin(x) 返回
x 的正弦。 sqrt(x) 返回 x 的平方根,。 tan(x) 返回 x
的正切,。
Date
日期對象。這個對象可以儲存任意一個日期,,從 0001 年到 9999 年,,并且可以精確到毫秒數(shù)(1/1000
秒)。在內(nèi)部,,日期對象是一個整數(shù),,它是從 1970 年 1 月 1 日零時正開始計算到日期對象所指的日期的毫秒數(shù)。如果所指日期比 1970
年早,,則它是一個負(fù)數(shù),。所有日期時間,如果不指定時區(qū),,都采用“UTC”(世界時)時區(qū),,它與“GMT”(格林威治時間)在數(shù)值上是一樣的。 定義一個日期對象:
var d = new Date;
這個方法使 d
成為日期對象,并且已有初始值:當(dāng)前時間,。如果要自定初始值,,可以用:
var d = new Date(99, 10, 1); //99 年 10 月 1 日 var d = new
Date('Oct 1, 1999'); //99 年 10 月 1
日
等等方法。最好的方法就是用下面介紹的“方法”來嚴(yán)格的定義時間,。
方法 以下有很多“g/set[UTC]XXX”這樣的方法,,它表示既有“getXXX”方法,又有“setXXX”方法,。“get”是獲得某個數(shù)值,,而“set”是設(shè)定某個數(shù)值。如果帶有“UTC”字母,,則表示獲得/設(shè)定的數(shù)值是基于
UTC
時間的,,沒有則表示基于本地時間或瀏覽期默認(rèn)時間的。 如無說明,,方法的使用格式為:“<對象>.<方法>”,,下同。 g/set[UTC]FullYear()
返回/設(shè)置年份,,用四位數(shù)表示,。如果使用“x.set[UTC]FullYear(99)”,則年份被設(shè)定為 0099
年,。 g/set[UTC]Year()返回/設(shè)置年份,,用兩位數(shù)表示。設(shè)定的時候瀏覽器自動加上“19”開頭,,故使用“x.set[UTC]Year(00)”把年份設(shè)定為
1900
年,。 g/set[UTC]Month()返回/設(shè)置月份。 g/set[UTC]Date()返回/設(shè)置日期,。 g/set[UTC]Day()返回/設(shè)置星期,,0
表示星期天。 g/set[UTC]Hours()返回/設(shè)置小時數(shù),,24小時制,。 g/set[UTC]Minutes()返回/設(shè)置分鐘數(shù)。 g/set[UTC]Seconds()返回/設(shè)置秒鐘數(shù),。 g/set[UTC]Milliseconds()返回/設(shè)置毫秒數(shù),。 g/setTime()
返回/設(shè)置時間,該時間就是日期對象的內(nèi)部處理方法:從 1970 年 1 月 1 日零時正開始計算到日期對象所指的日期的毫秒數(shù),。如果要使某日期對象所指的時間推遲
1 小時,,就用:“x.setTime(x.getTime() + 60 * 60 * 1000);”(一小時 60 分,一分 60 秒,,一秒 1000
毫秒),。 getTimezoneOffset()
返回日期對象采用的時區(qū)與格林威治時間所差的分鐘數(shù),。在格林威治東方的市區(qū),該值為負(fù),,例如:中國時區(qū)(GMT+0800)返回“-480”。 toString()
返回一個字符串,,描述日期對象所指的日期,。這個字符串的格式類似于:“Fri Jul 21 15:43:46 UTC+0800
2000”。 toLocaleString()
返回一個字符串,,描述日期對象所指的日期,,用本地時間表示格式。如:“2000-07-21
15:43:46”,。 toGMTString() 返回一個字符串,,描述日期對象所指的日期,用 GMT
格式,。 toUTCString() 返回一個字符串,,描述日期對象所指的日期,用 UTC
格式,。 parse()
用法:Date.parse(<日期對象>),;返回該日期對象的內(nèi)部表達(dá)方式。
全局對象 全局對象從不現(xiàn)形,,它可以說是虛擬出來的,,目的在于把全局函數(shù)“對象化”。在 Microsoft
JScript 語言參考中,,它叫做“Global
對象”,,但是引用它的方法和屬性從來不用“Global.xxx”(況且這樣做會出錯),而直接用“xxx”,。
屬性 NaN
一早就說過了,。 方法 eval()
把括號內(nèi)的字符串當(dāng)作標(biāo)準(zhǔn)語句或表達(dá)式來運(yùn)行。 isFinite() 如果括號內(nèi)的數(shù)字是“有限”的(介于
Number.MIN_VALUE 和 Number.MAX_VALUE 之間)就返回 true,;否則返回
false,。 isNaN() 如果括號內(nèi)的值是“NaN”則返回 true 否則返回
false。 parseInt()
返回把括號內(nèi)的內(nèi)容轉(zhuǎn)換成整數(shù)之后的值,。如果括號內(nèi)是字符串,,則字符串開頭的數(shù)字部分被轉(zhuǎn)換成整數(shù),如果以字母開頭,,則返回“NaN”,。 parseFloat()
返回把括號內(nèi)的字符串轉(zhuǎn)換成浮點數(shù)之后的值,字符串開頭的數(shù)字部分被轉(zhuǎn)換成浮點數(shù),,如果以字母開頭,,則返回“NaN”,。 toString()
用法:<對象>.toString();把對象轉(zhuǎn)換成字符串,。如果在括號中指定一個數(shù)值,,則轉(zhuǎn)換過程中所有數(shù)值轉(zhuǎn)換成特定進(jìn)制。 escape()
返回括號中的字符串經(jīng)過編碼后的新字符串,。該編碼應(yīng)用于
URL,,也就是把空格寫成“%20”這種格式。“+”不被編碼,,如果要“+”也被編碼,,請用:escape('...',
1)。 unescape() 是 escape()
的反過程,。解編括號中字符串成為一般字符串,。
函數(shù)函數(shù)的定義 所謂“函數(shù)”,是有返回值的對象或?qū)ο蟮姆椒ā? 函數(shù)的種類 常見的函數(shù)有:構(gòu)造函數(shù),,如
Array(),,能構(gòu)造一個數(shù)組;全局函數(shù),,即全局對象里的方法,;自定義函數(shù);等等,。 自定義函數(shù) 定義函數(shù)用以下語句:
function 函數(shù)名([參數(shù)集]) { ... [return[ <值>];]
... }
其中,,用在 function 之后和函數(shù)結(jié)尾的大括號是不能省去的,就算整個函數(shù)只有一句,。
函數(shù)名與變量名有一樣的起名規(guī)定,,也就是只包含字母數(shù)字下劃線、字母排頭,、不能與保留字重復(fù)等,。 參數(shù)集可有可無,但括號就一定要有,。
參數(shù) 是函數(shù)外部向函數(shù)內(nèi)部傳遞信息的橋梁,,例如,想叫一個函數(shù)返回 3
的立方,,你就要讓函數(shù)知道“3”這個數(shù)值,,這時候就要有一個變量來接收數(shù)值,這種變量叫做參數(shù),。 參數(shù)集是一個或多個用逗號分隔開來的參數(shù)的集合,,如:a, b,
c。
函數(shù)的內(nèi)部有一至多行語句,,這些語句并不會立即執(zhí)行,,而只當(dāng)有其它程序調(diào)用它時才執(zhí)行,。這些語句中可能包含“return”語句。在執(zhí)行一個函數(shù)的時候,,碰到
return 語句,,函數(shù)立刻停止執(zhí)行,并返回到調(diào)用它的程序中,。如果“return”后帶有<值>,,則退出函數(shù)的同時返回該值。
在函數(shù)的內(nèi)部,,參數(shù)可以直接當(dāng)作變量來使用,并可以用 var
語句來新建一些變量,,但是這些變量都不能被函數(shù)外部的過程調(diào)用,。要使函數(shù)內(nèi)部的信息能被外部調(diào)用,要么使用“return”返回值,,要么使用全局變量,。
全局變量 在 Script
的“根部”(非函數(shù)內(nèi)部)的“var”語句所定義的變量就是全局變量,它能在整個過程的任意地方被調(diào)用,、更改,。 例
function addAll(a, b, c) { return a + b + c; }
var
total = addAll(3, 4, 5);
這個例子建立了一個叫“addAll”的函數(shù),它有 3 個參數(shù):a, b,
c,,作用是返回三個數(shù)相加的結(jié)果,。在函數(shù)外部,利用“var total = addAll(3, 4, 5);”接收函數(shù)的返回值,。
更多的時候,,函數(shù)是沒有返回值的,這種函數(shù)在一些比較強(qiáng)調(diào)嚴(yán)格的語言中是叫做“過程”的,,例如 Basic 類語言的“Sub”,、Pascal
語言的“procedure”。
屬性 arguments
一個數(shù)組,,反映外部程序調(diào)用函數(shù)時指定的參數(shù),。用法:直接在函數(shù)內(nèi)部調(diào)用“arguments”。
|