Transcript 03-基本資料型態
第三章
基本資料型態
張智星
[email protected]
http://mirlab.org/jang
台大資工系 多媒體檢索實驗室
JavaScript 程式設計與應用:用於網頁用戶端
本章大綱
大綱
本章說明 JavaScript 常用的資料型態,以及與這些資料型
態相關的函式及範例。
主題
3-1:資料型態簡介
3-2:數字
3-3:字串
3-4:布林
3-5:日期物件
3-6:數學物件
3-7:影像物件
2/43
JavaScript 程式設計與應用:用於網頁用戶端
3-1:資料型態簡介
本小節介紹JavaScript各種基本資料型態。
3/43
JavaScript 程式設計與應用:用於網頁用戶端
JavaScript資料型態
JavaScript 的資料型態(Data Type)可分成三類
基本資料型態
組合資料型態
字串(string)
數字(number)
布林(boolean)
函數(function)
內建物件:日期、陣列、Math、Number等
自訂物件
特殊資料型態
Null & undefined
4/43
JavaScript 程式設計與應用:用於網頁用戶端
範例3-1
主題:用 typeof() 函數得到各種變數的資料型
態。
連結:typeof01.htm
說明
使用「==」、「>」、「<」等判斷運算元,會
回傳true或false的布林型態。
在JavaScript中的變數跟C語言不一樣,不需要在
宣告時指定資料型態,而且同一個變數可以變換
成不同的資料型態。
5/43
JavaScript 程式設計與應用:用於網頁用戶端
範例3-2
主題:顯示各種會產生undefined的範例。
連結:undefined01.htm
說明
「undefined」是一種特殊的資料型態,專門用來判斷下
列兩種情況
不存在的變數:未宣告,且未指定值的變數。
未初始化的變數:已宣告,但未指定值的變數。
變數如果未經過宣告,就無任何值存在,所以無法取用,
但此類變數可以經由 typeof() 傳回 “undefined” 字串。
如果只經過宣告,但尚未初始化,它的預設值則是
undefined(非字串!)。此類變數亦可經由 typeof() 傳
回 “undefined”。
6/43
JavaScript 程式設計與應用:用於網頁用戶端
範例3-3
主題:檢查 null 的各種性質和用法。
連結: null01.htm
程式碼重點
x=null;
(x)?document.writeln("True!"):document.writeln("False!");
說明
範例中註解的Null或NULL都是錯誤的(在C語言
中用的是NULL)。
null, 0, false,在條件判斷時都是不成立的條件。
7/43
JavaScript 程式設計與應用:用於網頁用戶端
3-2:數字
本小節介紹數值的運算及相關函式的使用。
8/43
JavaScript 程式設計與應用:用於網頁用戶端
數值內存與表示
為保留最高的精確度,JavaScript 內部把所有的數
值均表示成雙倍精準(Double Precision)浮點數。
整數和浮點數,其內部儲存和運算方式都是以雙倍
精準的浮點數來進行。
在 PC 上,一般浮點數都是佔用 4 bytes,但雙倍精
準浮點數會佔用 8 bytes,以提升數值運算的精確度。
(我們一般常用的科學計算軟體 MATLAB,它的預設
數值型態也是雙倍精準浮點數。)
9/43
JavaScript 程式設計與應用:用於網頁用戶端
數值基底
JavaScript 的整數大部分是以十進位來表示,但若
有需要,也可以使用不同的基底(Base)來表示,
例如八進位和十六進位:
八進位的數字以 0 開頭,只包含數字 0 到 7。(但是如
果有一個數字的開頭是 0,但卻也包含數字 8 或 9,或包
含小數點,那麼它就會被認定成是一個十進位數字。)
十六進位的數字以 "0x",只包含了數字 0 到 9,和字母
A 到 F(不論大小寫)。字母 A 到 F 分別代表 10 到 15。
也就是說,0xA 等於 10,而 0xF 等於 15。
八進位和十六進位的數字可以是負數,但是不能有小數部
分,而且也不能以科學記號法(指數)來表示。
10/43
JavaScript 程式設計與應用:用於網頁用戶端
數值表示範例(1)
數字
說明
十進位表示法
.0001, 0.0001,
4 個浮點數,值皆相等。
1e-4, 1.0e-4
0.0001
3.45e2
一個浮點數。
345
42
一個整數。
42
0378
一個整數。雖然看起來像八進位數字
(以0開頭),8 不是正確的數字,所以 378
這個數字是十進位數字。
0377
一個八進位整數。注意它雖然只比上面
的數字小1,它真正的值卻截然不同。
0.0001
一個浮點數字。即使以0開頭,它卻不是
0.0001
八進位數字,因為它有一個小數點。
255
11/43
JavaScript 程式設計與應用:用於網頁用戶端
數值表示範例(2)
數字
說明
十進位表示法
00.0001
這是一個錯誤。開頭的兩個0顯示它是個八進位
數,可是八進位數字是不能有小數點的。
(編譯器錯誤)
0Xff
十六進位的整數。
255
0x37CF
十六進位的整數。
14287
0x3e7
十六進位的整數。注意 "e" 並不是指數。
999
0x3.45e2 這是一個錯誤。十六進位數字不能有小數部分。 (編譯器錯誤)
說明
浮點數可用小數點或用科學記號法來表示。若用科學記號法,大寫或
小寫的 “e” 都可以表示 「10的次方」。
JavaScript 使用IEEE 754 浮點標準的數值表示法來表示數字,您可以
寫出大到 1.7976931348623157x10308 和小到 5.00x10-324 的數字。
12/43
JavaScript 程式設計與應用:用於網頁用戶端
範例3-4
主題:產生 JavaScript 的特殊數值
連結:number01.htm
說明
NaN(Not a Number,非數字):用不正確的資料來執行數學
運算時,或是執行無意義的數學運算,就會產生這個數值。
正的無限大(Infinity):當正數大到無法顯示在 JavaScript 中
時,就會使用這個數值。
負的無限大(-Infinity):當負數大到無法顯示在 JavaScript
中時,就會使用這個數值。
為什麼「Math.pow(0, 0) = 1」?理論上應該是 NaN…
13/43
JavaScript 程式設計與應用:用於網頁用戶端
Number物件
Number 是一個內訂的物件,我們可以使用 它的相
關屬性來代表與數字相關的常數
常數表示法
說明
Number.MIN_VALUE
傳回能在 JavaScript 中表示最接近零的數
字。大約等於 5.00E-324。
Number.MAX_VALUE
傳回能在 JavaScript 中表示的最大值。大
約等於 1.79E+308。
傳回一個能在 JavaScript 中表示、且比最
Number.NEGATIVE_INFINITY 大負數 (-Number.MAX_VALUE) 還要小的
值。
Number.POSITIVE_INFINITY
傳回能在 JavaScript 中表示且大於最大數
(Number.MAX_VALUE) 的值。
Number.NaN
一個特殊值,可指出算術運算式的傳回值
不是一個數字。
14/43
JavaScript 程式設計與應用:用於網頁用戶端
數字相關函式(1)
函式格式
說明
parseInt(numString,
[radix])
傳回一個從字串 numString 轉換而來的整
數,其中 radix 是介於 2 和 36 之間的值,
用來指出包含在 numString 中的數字基底
(Base)。如果未提供,則字首為 0x 的字
串會視為十六進位的數字,而字首為 0 的
字串則會視為八進位的數字。其他所有的字
串則會視為十進位的數字。
parseFloat(numString)
傳回一個從字串 numString 轉換而來的浮
點數。
isNaN(number)
如果 number 值為 NaN,則 isNaN 函式會
傳回 true,否則會傳回 false。通常使用此
函式來測試 parseInt 和 parseFloat 方法的
傳回值。
15/43
JavaScript 程式設計與應用:用於網頁用戶端
數字相關函式(2)
函式格式
x.toString([radix])
說明
將數值 x 轉成特定基底 radix 的字
串。
將數值 x 轉成小數點以下 n 位有
x.toFixed(n)
效數字的小數點表示法。
將數值 x 轉成小數點以下 n 位有
x.toExponential(n)
效數字的科學記號表示法。
x.toPrecision(n)
將數值 x 轉成共具有 n 位有效數
字。
16/43
JavaScript 程式設計與應用:用於網頁用戶端
範例3-5
主題:利用toString()函式,顯示不同基底的
表示方式
連結:number03.htm
程式碼重點
document.writeln("<td>"+x.toString());
document.writeln("<td>"+x.toString(2));
document.writeln("<td>"+x.toString(8));
document.writeln("<td>"+x.toString(16));
說明
如果toString沒有放任何參數,預設用十進位轉換。
17/43
JavaScript 程式設計與應用:用於網頁用戶端
範例3-6
主題:與數字物件(Number)相關的常數與
函式的測試
連結:number02.htm
說明
這個範例使用Number物件,以及數字相關函式
表中的各種方法來處理數值資料。
18/43
JavaScript 程式設計與應用:用於網頁用戶端
3-3:字串
本小節介紹各種字串物件及函式運用。
19/43
JavaScript 程式設計與應用:用於網頁用戶端
字串表示方式
字串資料型態可以用來表示一列文字內容。我們只要把文字
括在相符的單括號或雙括號裡,就可以形成一個字串。
"This is a string"
'This is a string quoted by single quotes'
"This is a string with 'single' quotes"
'This is a string with "double" quotes'
"This another string with \"double\" quotes"
說明
可用單引號或雙引號來界定字串的開始和結束。
為了避掉雙引號的原來用途(標示字串的開始和結束),我們要在雙
引號前加上反斜線(\)。
20/43
JavaScript 程式設計與應用:用於網頁用戶端
字串物件函式與屬性(1)
性質或方法
說明
length
傳回字串的長度
toUpperCase()
換成大寫字母
toLowerCase()
換成小寫字母
concat()
字串並排(等效於使用加號)
charAt(n)
抽出第 n 個字元(n=0 代表第一個字元)
charCodeAt(n)
抽出第 n 個字元(n=0 代表第一個字元),並轉換成
Unicode
substr(m, n)
傳回一個字串,從位置 m 開始,且長度為 n
substring(m, n)
傳回一個字串,從位置 m 開始,結束於位置 n-1
indexOf(str)
尋找子字串 str 在原字串的第一次出現位置
lastIndexOf(str) 尋找子字串 str 在原字串的最後一次出現位置
21/43
JavaScript 程式設計與應用:用於網頁用戶端
字串物件函式與屬性(2)
性質或方法
說明
等效的HTML標籤
big()
增大字串的字型
<big>...</big>
small()
減小字串的字型
<small>...</small>
blink()
閃爍字串(不適用於 IE、Chrome)<blink>...</blink>
bold()
變粗體
<b>...</b>
italics()
變斜體
<i>...</i>
fixed()
變等寬字體
<tt>...</tt>
strike()
槓掉字串
<strike>...</strike>
sub()
變下標
<sub>...</sub>
sup()
變上標
<sup>...</sup>
fontcolor() 設定字串的顏色
<font
color=...>...</font>
fontsize()
<font size=...>...</font>
設定字串的字型大小
22/43
JavaScript 程式設計與應用:用於網頁用戶端
範例3-7
主題:示範各種字串物件的方法與屬性
連結:string01.htm
說明
注意 substr(m, n) 和 substring(m, n) 的差異。如果 text
= "我願是千萬條江河" ,則
text.substr(3,5)會傳回 “千萬條江河” (第3個字元開始,取5個字
元)
text.substring(3,5)會傳回 “千萬” (第3個字元開始,第4個字元
結束)
有關於字串的比對,只提到了 indexOf() 和 lastIndexOf()
兩個方法,事實上 JavaScript 對於字串的比對和代換有許
多強大的功能,例如 search、match、replace 等函數,
23/43
這些功能統稱「通用表示法」,後面的章節會仔細介紹。
JavaScript 程式設計與應用:用於網頁用戶端
範例3-8
主題:使用eval()函式,將字串轉成程式碼
連結:eval01.htm
程式碼重點
for (i=1; i<=3; i++){
command = "x" + i + "=" + i*i*i;
eval(command);
}
說明
我們把 JavaScript 要執行的命令收集在字串變數
command,然後再用 eval 指令來 “執行” 這個字串,就
可以創造出三個變數 x1、x2 和 x3。
24/43
JavaScript 程式設計與應用:用於網頁用戶端
各種物件的toString()
物件
toString() 的結果
Array(陣列)
將 Array 的元素轉換為字串,形成以逗號串連起來的
結果,此結果 與 Array.toString() 和 Array.join() 得
到的結果相同
Boolean(布林)
如果布林值為 True,會傳回 "true";否則會傳回
"false"
Date(日期)
傳回顯示日期的文字形式
Error(錯誤)
傳回包含錯誤訊息的字串
Function(函數) 傳回函數的定義
Number(數字)
傳回數字的文字表示法
String(字串)
傳回 String 物件的值
自訂物件
傳回 "[object Object]"
25/43
JavaScript 程式設計與應用:用於網頁用戶端
範例3-9
主題:利用toString()將各種物件轉成字串
連結:toString01.htm
說明
若要將字串轉成數值,可用 parseInt() 或是
parseFloat() 這兩個函數
parseInt() 可將字串轉整數。(若轉換不成功,則傳回
NaN。)
parseFloat() 可將字串轉浮點數。(若轉換不成功,則
傳回 NaN。)
26/43
JavaScript 程式設計與應用:用於網頁用戶端
3-4:布林
本小節介紹布林物件的使用方式。
27/43
JavaScript 程式設計與應用:用於網頁用戶端
範例3-10
主題:有關Boolean資料型態的測試
連結:boolean01.htm
程式碼重點
說明
document.write(“x==y ==> ” + (x==y) + “<br>”);
document.write(“y==z ==> ” + (y==z) + “<br>”);
document.write(“x=z ==> ” + (x=z) + “<br>”);
JavaScript 中的布林(Boolean)資料型態的值只有兩種:
true 和 false。
在上述範例中,(x==y) 和 (y==z) 都會測試兩個數目是
否相等,因此會回傳布林常數 true 和 false,但是 (x=z)
是一個指派敘述,因此回傳的值就是被指派的值。
28/43
JavaScript 程式設計與應用:用於網頁用戶端
3-5:日期物件
本小節介紹日期物件的使用方法。
29/43
JavaScript 程式設計與應用:用於網頁用戶端
Date物件相關函式
方法
說明
toString()
以標準字串來表示日期物件
toLocaleString()
以地方字串(依作業系統而有所不同)來表示日
期物件
getYear()
取得年份
getMonth()
取得月份(需注意:0 代表一月,因此例如若是
八月,結果就是 7)
getDate()
取得日數
getHours()
取得時數
getMinutes()
取得分鐘數
getSeconds()
取得秒數
getDay()
取得星期數(例如若是星期四,結果就是 4)
30/43
JavaScript 程式設計與應用:用於網頁用戶端
範例3-11
主題:示範各種日期物件的屬性及函式
連結:date01.htm
說明
new Date() 即會產生包含現在日期的一個日期物件。
new Date() 產生的物件,並不會因為過了一段時間後,
使用getSeconds()這些取得時間訊息的函式就會跟著改變,
這些時間訊息都在new Date()的時候決定了。
31/43
JavaScript 程式設計與應用:用於網頁用戶端
範例3-12
主題:使用 eval()簡化範例3-11的程式碼
連結:date02.htm
程式碼重點
for (i=0; i<method.length; i++)
document.writeln("<br> today." + method[i] + "()
= " + eval("today."+method[i]+"();"));
說明
組成字串來讓 eval 進行執行。
32/43
JavaScript 程式設計與應用:用於網頁用戶端
範例3-13(1)
主題:利用getTime()寫一個碼表程式。
連結:dateGetTime01.htm
說明
getTime()可以傳回來某個時間物件與 1970 年 1 月 1 日
零時的時間差距,單位是毫秒。
當按鈕文字是”開始計時”時,按下按鈕後,我們記錄目前
時間(date1),設定時間顯示為”計時中...”,並將按鈕文字
改為”停止計時”。
當按鈕文字是”停止計時”時,按下按鈕後,我們記錄目前
時間”date2”,並算出時間差距(timeDiff)並顯示在時間欄
位內,同時將按鈕文字改為”歸零”。
33/43
JavaScript 程式設計與應用:用於網頁用戶端
範例3-13(2)
說明
若要設計在計時過程中,文字欄位不斷顯示目前
計時結果,但這種密集的即時顯示會比較消耗
CPU 的計算時間。欲達到此功能,必須使用
setTimeOut() 函數,將會在後面詳述。
我們也可以產生一個日期物件後,再對此物件進
行修改(例如改變秒數或月份)或格式轉換,相
關的方法很多,在此不再贅述。
34/43
JavaScript 程式設計與應用:用於網頁用戶端
範例3-12 (流程圖)
啟始狀態
按鈕顯示:開始計時
文字欄位:00:00:00
按鈕顯示:停止計時
文字欄位:計時中…
按鈕顯示:歸零
文字欄位:xx.xx.xx
35/43
JavaScript 程式設計與應用:用於網頁用戶端
3-6:數學物件
本小節介紹數學物件(Math)的各種屬性及
函式使用方法。
使用時必須引用Math物件,例如
Math.PI
Math.exp(-2)
36/43
JavaScript 程式設計與應用:用於網頁用戶端
數學物件方法(1)
方法
說明
abs(x)
取一個數 x 的絕對值
ceil(x)
傳回大於或等於 x 的最小整數
floor(x)
傳回小於或等於 x 的最大整數
log(x)
計算以 e (2.71828) 為底的自然對數值
exp(x)
傳回以 e (2.71828) 為底的冪次方值
pow(a, n)
計算任意 a 的 n 次方
max(a, b)
傳回兩個數 a, b 中較大的數
min(a, b)
傳回兩個數 a, b 中較小的數
sqrt(x)
求出一個數 x 的平方根
round(x)
四捨五入至整數
37/43
JavaScript 程式設計與應用:用於網頁用戶端
數學物件方法(2)
方法
說明
random()
隨機產生一個介於 0~1 的數值
sin(x)
正弦函數
cos(x)
餘弦函數
tan(x)
正切函數
asin(x)
反正弦函數
acos(x)
反餘弦函數
atan(x)
反正切函數
說明
如果你的工作或研究牽涉到許多數學運算,那就
應該使用 MATLAB 來完成,比較省時省力!
38/43
JavaScript 程式設計與應用:用於網頁用戶端
範例3-14
主題:示範各種數學物件函式及屬性的使用
連結:math01.htm
程式碼重點
with (Math){ // 使用 Math 物件的另一種方法
document.writeln(pow(cos(PI/3),2)+pow(sin(PI/3),2));
}
說明
只要放在 with(Math) 大括弧中的數學函數,都可
以不再引用 Math。
39/43
JavaScript 程式設計與應用:用於網頁用戶端
3-7:影像物件
本小節介紹影像物件各種屬性及函式的使用
方法。
40/43
JavaScript 程式設計與應用:用於網頁用戶端
影像物件屬性
影像物件也是一個內建的物件,可以由兩種方式產生:
由網頁的影像標籤 <img> 所產生,並經由 id 屬性來取得影像物件。
由 new Image() 來產生新的影像物件,並可指定其對應影像網址,
以達到快取(Cache)功能。
影像比較常用的屬性如下:
src:影像的網址。
tagName:標籤名稱(即是IMG)。
id:id名稱
naturalWidth:原始影像的寬度,以像素為單位。
naturalHeight:原始影像的高度,以像素為單位。
clientWidth:網頁顯示影像的寬度,以像素為單位。
clientHeight:網頁顯示影像的高度,以像素為單位。
ownerDocument:影像所在的文件。
41/43
JavaScript 程式設計與應用:用於網頁用戶端
範例3-15
主題:列出Image物件的各種屬性及方法
連結:imageProp01.htm
程式碼重點
for (prop in myImage)
document.write("<br>myImage." + prop + " = "
+ myImage[prop]); </script>
說明
指定網址後,影像物件就會把各種相關資訊從網址抓回來,
若事先指定多個影像物件的網址,就可以達到快取的功能。
據筆者所知,JavaScript 目前並沒有相關的 audio 物件,
可以達到快取的功能。
42/43
JavaScript 程式設計與應用:用於網頁用戶端
範例3-16
主題:直接抓取網頁中的影像標籤,並列出其性質
連結:imageProp02.htm
說明
範例中,你會看到影像圖檔的呈現,那是因為
myImage.outerHTML 就是顯示此影像的標籤,所以你會
看到此影像。
若obj為<a target=_blank href="myHome.htm">linked
text</a>
obj.outerHTML = <a target=_blank
href="myHome.htm">linked text</a>
obj.innerHTML = linked text
43/43