JavaScript1.5 資料型態(Datatype)

資料型態(Datatype)

JS 的資料型態可以分成三大類:基本資料型態、特殊資料型態與複合資料型態。

  • 基本資料型態(Basic Datatype)
    • 數值(Number)
    • 字串(String)
    • 布林值(Boolean)
  • 特殊資料型態(Special Datatype)
    • 空值(null)
    • 未定義的值(undefined)
  • 複合資料型態(Composite Datatype)
    • 物件(Object) – 無序之值的集合
    • 陣列(Array ) – 有序之值的集合
    • 函式(Function)
JS 的資料型態(Datatype)
類型 說明
數值(Number) 整數或者是浮點數。不在引號內的任何數字,例如: 6789 或 6.789 。
字串(String) 引號(單引號或雙引號)內的一串字串,例如: "西元 987 年" 或 "Good"。
布林值(Boolean) true(真) 或 false(假)。
空值(null) 一個特別的關鍵字表示一個空值, null 並且也是一個內定值。因為 JS 語言有分大小寫,所以 null 與 NULL 、 Null 等等都是不同的。可以指定變數的值為 null ,用來刪除變數的內容但又不會刪除整個變數。
未定義的值(undefined) 屬性未定義的值, undefined 並且也是一個內定值。一個不存在的物件屬性,已經宣告,但未指定數值的變數。 undefined 與 null 所不同的是, undefined 好比特殊值 NaN(非數字) ,而 null 就好比數字 0 。

以上是相對較小之值的型式或資料型態的集合,這些可以讓您執行現有的功能作為應用。在整數(integer)與實數(real-valued) 之間並沒有明確的區別。雖然 JS 中也無明確的日期資料型態,但是可以使用日期物件與其使用方法來處理日期資料。

在 JS 中,物件與函式是其基本要素。您可以將物件當作是一個內容已被命名的值,而函式就像一個您可以執行應用的程序。

資料型態的轉換(Data Type Conversion)

JS 是一種動態類型的語言。那意味著當您宣告一個變數時,不必指定它的資料型態,因為在程序執行期間,資料型態會因其所需而做必要的自動轉換。例如:

var answer = 77			//之後,您可以指派相同的變數一個字串型態的值,例如:
answer = "Hi~您好!"

因為 JS 是動態類型(dynamically typed) 的語言,所以上述例子的指派過程並不會引起錯誤的訊息。

在 JS 運算式中,null 乘以任何數其結果皆為 0,undefined 乘以任何數其結果皆為 NaN。而在有數字的字串當中使用「 + 」號時,運算式則視它為字串,假如有「 – 」號或其它運算子,運算式則視它為數值。例如:

x = "The answer is " + 66	//回傳值為 "The answer is 66"
y = 66 + " is the answer"	//回傳值為 "66 is the answer"
"66" - 6			//回傳值為 60(將字串型態的值轉換為數值型態)
"66" + 6			//回傳值為 666(將數值型態的值轉換為字串型態)

實字(Literal)

所謂實字(Literal)就是直接在程式中所出現的資料值。

您可以使用實字(Literals)來表示在 Script 當中的值。這些照字義提供在您 Script 中的值是固定的,並且它不是個變數。

陣列實字(Array Literals)

陣列實字是用方括號([])括住的一份零個或多個陣列元素的表達式(expressions)清單。當您使用陣列實字建立一個陣列時,它會以您指定的值來初始化(Initialized)它的元素,並且其陣列長度的設置為您所指定參數(arguments)的數目。

以下的範例中,建立了一個使用三個元素與其長度為三的 coffees 陣列:

var coffees = ["French Roast", "Colombian", "Kona"];

※注意:陣列實字也是物件初始器(object initializer)的一種。

假如於上層(top-level) Script 中使用實字來建立陣列,則 JS 每次解譯該陣列時會計算表達式所包含的陣列實字。除此之外,每次函式被呼叫時,函式中所使用的實字均會被建立。

※陣列實字也是陣列物件。

在陣列實字中額外的逗號(Extra Commas in Array Literals)

在陣列實字中,您不必指定所有的陣列元素。如果您將兩個逗號放入資料列時,則會以未指定元素的空白來建立陣列。以下的範例建立了一個 fish 陣列:

var fish = ["Lion", , "Angel"];	//該陣列有三個陣列元素

上述陣列中,有兩個元素有值和一個空元素。

fish[0] 是 "Lion"、fish[1] 是 undefined、fish[2] 是 "Angel"。

假如您在元素清單的結尾包含尾端逗號,則該逗號將會被忽略。在以下的範例中,陣列的長度是 3,但是並無 myList[3]。在元素清單中的所有其它逗號將代表新的元素。

var myList = ['home', , 'school', ];

myList[0] 是 home、myList[1] 是 undefined、myList[2] 是 school。

在以下的範例中,陣列的長度是 4,myList[0] 與 myList[2] 之值為未定義。

var myList = [ , 'home', , 'school'];

在以下的範例中,陣列的長度是 4,myList[1] 與 myList[3] 之值為未定義,並且只有忽略最後的逗號。

var myList = ['home', , 'school', , ];

布林實字(Boolean Literals)

布林類型有兩個實字:true 與 false。

請勿混淆原始的布林值 true 和 false布林物件的 true 和 false 這兩者。布林物件是個環繞原始布林資料類型的封套資料(wrapper)。

整數(Integers)

整數可以表示為十進位(基底 10)、十六進位(基底 16) 和八進位(基底 8)。十進位整數實字組成一連串沒有前置 0 的數字。在整數實字前置的 0 表示它是處於八進位的值;前置為 0x(或 0X )是表示十六進位。十六進位整數可以包含數字(0-9) 和英文字母 a-f 與 A-F。八進位整數可以包含的數字只有 0-7。

在 ECMA-262 Edition 3 標準中,八進位整數實字已經被移除了。不過 JS 仍然保有向後的兼容性來支援它們。

67890				//表示十進位(decimal)
0xbdff				//表示十六進位(hexadecimal)
0101				//表示八進位(octal)
-64.789				//表示負數帶有小數的十進位

浮點數實字(Floating-Point Literals)

浮點數實字有以下幾個部份:

  • 十進制整數(decimal integer)
  • 小數點(decimal point)
  • 分數(fraction)
  • 指數(exponent)

指數的部份是以一個「e」或「E」的符號,之後跟隨著一個可以帶正負號的十進位整數(前面加上 + 或 – )。浮點數實字至少必須有一個數字與小數點或「e」或「E」。

浮點數實字的一些範例:

0.0102 .01026 -3.1E12 .1e12 2E-12.

3.8E + 3			//代表 3800(3.8 的小數點往右移三個位數)
3.8E - 3			//代表 0.0038(3.8 的小數點往左移三個位數)

更簡潔的語法為:[數字][.數字][(E|e)[(+|-)]數字]

物件實字(Object Literals)

物件實字是物件的零個或多個配對的屬性名稱及相關之值的清單,並且使用大括號括住({})。您不應該使用物件實字於敘述句的開頭。這將會導致錯誤或者無法如預期般的運作,因為 { 將被解譯為區塊的開頭。

以下是一個物件實字的範例。car 物件的第一個元素定義了一個名為 myCar 的屬性,第二個元素則是用來調用(invokes)函式 (CarTypes("Honda")) 的 getCar 屬性,第三個元素 special 屬性則是使用現有 Sales 變數。

var Sales = "Toyota";

function CarTypes(name) {
  if (name == "Honda")
     return name;
  else
     return "Sorry, we don't sell " + name + ".";
}

var car = { myCar: "Saturn", getCar: CarTypes("Honda"), special: Sales };

document.write(car.myCar);	// Saturn
document.write(car.getCar);	// Honda
document.write(car.special);// Toyota

此外,您可以使用數字或字串實字作為屬性的名稱或巢狀內另一個物件的名稱。下面範例將會使用這些選項。

var car = { manyCars: {a: "Saab", b: "Jeep"}, 7: "Mazda" };

document.write(car.manyCars.b);	// Jeep
document.write(car[7]);			// Mazda

請注意:

var foo = {a: "alpha", 2: "two"};
document.write(foo.a);		// alpha
document.write(foo[2]);		// two
//document.write(foo.2);	// Error: missing ) after argument list
//document.write(foo[a]);	// Error: a is not defined
document.write(foo["a"]);	// alpha
document.write(foo["2"]);	// two

字串實字(String Literals)

字串或者字元須以雙引號「"」或者單引號「'」括住。在雙引號或者單引號之內所括住的字串裡面,還想使用雙引號或者單引號的話,則應寫成 " 或 ' 。例如:

"skyfate" 'skyfate' "我是 "skyfate"" 'alert('yes')'

※除非您特別需要使用到字串物件,否則您應該使用字串實字。

在字串中使用特殊字元(Using Special Characters in Strings):

除了普通的字元之外,您也可以在字串中使用特殊字元,例如下面所示:

"one line n another line"

下面的表格列出了您可以使用在 JS 字串中的特殊字元。

  b 倒退字元
  f 欄位
  n 換行
  r 歸位
  t 定位
  v 垂直定位
  \ 反斜線
  " 雙引號
  ' 單引號
  nnn 以 8 進位數字指定字元, nnn 的值為 0 到 377 ,例如 251 是一個 copyright 的符號 ©。
  xnn 以 16 進位數字指定字元, nn 的值為 00 到 FF ,例如 xA9 是一個 copyright 的符號 ©。
  unnnn 以 16 進位 unicode 數字指定字元,例如 u00A9 是一個 copyright 的符號 ©。