資料類型和變數

資料型別

電腦顧名思義就是可以做數學計算的機器,因此,電腦程式理所當然地可以處理各種數值。但是,電腦能處理的遠不止數值,還可以處理文字、圖形、音訊、視訊、網頁等各種各樣的數據,不同的數據,需要定義不同的數據類型。在JavaScript中定義了以下幾種資料型別:

Number

#JavaScript不區分整數與浮點數,統一以Number表示,以下都是合法的Number型:

123; // 整數1230.456; // 浮點數0.4561.2345e3; // 科學計數法表示1.2345x1000,等同於1234.5-99; // 負數NaN; // NaN表示Not a Number,當無法計算結果時用NaN表示Infinity; // Infinity表示無限大,當數值超過了JavaScript的Number所能表示的最大值時,就表示為Infinity

計算機由於使用二進制,所以,有時候用十六進位表示整數比較方便,十六進位用0x前綴和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等,它們和十進位表示的數值完全一樣。

Number可以直接做四則運算,規則和數學一致:

1 + 2; // 3(1 + 2) * 5 / 2; // 7.52 / 0; // Infinity0 / 0; // NaN10 % 3; // 110.5 % 3; // 1.5

注意%是求餘運算。

字串

字串是以單引號'或雙引號」括起來的任意文本,例如'abc',"xyz"等等。請注意,''或""本身只是一種表示方式,不是字串的一部分,因此,字串'abc'只有a,b,c這3個字元。

#布林值和布林代數的表示完全一致,一個布林值只有true、false兩種值,要嘛是true,要嘛是false,可以直接用true、false表示布林值,也可以透過布爾運算計算出來:true; // 這是一個true值false; // 這是一個false值2 > 1; // 這是一個true值2 >= 3; // 這是一個false值

&&運算是與運算,只有所有都為true,&&運算結果才是true:


true && true; // 這個&&語句計算結果為truetrue && false; // 這個&&語句計算結果為falsefalse && true && false; // 這個&&語句計算結果為false

||運算是或運算,只要其中有一個為true,| |運算結果就是true:


false || false; // 這個||語句計算結果為falsetrue || false; // 這個||語句計算結果為truefalse || true || false; //這個||語句計算結果為true

!運算是非運算,它是一個單目運算符,把true變成false,false變成true:

! true; // 結果為false! false; // 結果為true! (2 > 5); // 結果為true

布林值常用在條件判斷中,例如:

var age = 15;if (age >= 18) {
    alert('adult');
} else {
    alert('teenager');
}

比較運算子

當我們對Number做比較時,可以透過比較運算子得到一個布林值:

2 > 5; // false5 >= 2; // true7 == 7; // true

實際上,JavaScript允許對任意資料型別做比較:

false == 0; // truefalse === 0; // false

要特別注意相等運算​​子==。 JavaScript在設計時,有兩種比較運算子:

第一種是==比較,它會自動轉換資料型別再比較,很多時候,會得到非常詭異的結果;

#第二種是===比較,它不會自動轉換資料型,如果資料型別不一致,回傳false,如果一致,再比較。

由於JavaScript這個設計缺陷,不要使用==比較,始終堅持使用===比較。

另一個例外是NaN這個特殊的Number與所有其他值都不相等,包括它自己:

NaN === NaN; // false

唯一能判斷NaN的方法是透過isNaN()函數:

isNaN(NaN); // true

最後要注意浮點數的相等比較:

1 / 3 === (1 - 2 / 3); // false

這不是JavaScript的設計缺陷。浮點數在運算過程中會產生誤差,因為計算機無法精確表示無限循環小數。要比較兩個浮點數是否相等,只能計算它們之差的絕對值,看是否小於某個閾值:

Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true

null和undefined

null表示一個「空」的值,它和0以及空字串''不同,0是一個數值,''表示長度為0的字串,而null表示“空”。

在其他語言中,也有類似JavaScript的null的表示,例如Java也用null,Swift用nil,Python用None表示。但是,在JavaScript中,還有一個和null類似的undefined,它表示「未定義」。

JavaScript的設計者希望用null表示一個空的值,而undefined表示值未定義。事實證明,這並沒有什麼卵用,區分兩者的意義不大。大多數情況下,我們都應該用null。 undefined僅在判斷函數參數是否傳遞的情況下有用。

陣列

陣列是一組依序排列的集合,集合的每個值稱為元素。 JavaScript的陣列可以包括任意資料型別。例如:

[1, 2, 3.14, 'Hello', null, true];

上述陣列包含6個元素。數組用[]表示,元素之間用,分隔。

另一種建立陣列的方法是透過Array()函數實作:

new Array(1, 2, 3); // 建立了陣列[1, 2, 3]

然而,出於程式碼的可讀性考慮,強烈建議直接使用[]。

陣列的元素可以透過索引來存取。請注意,索引的起始值為0:

var arr = [1, 2, 3.14, 'Hello', null, true];
arr[0]; // 返回索引为0的元素,即1arr[5]; // 返回索引为5的元素,即truearr[6]; // 索引超出了范围,返回undefined

物件

#JavaScript的物件是一組由鍵-值組成的無序集合,例如:

var person = {
    name: 'Bob',
    age: 20,
    tags: ['js', 'web', 'mobile'],
    city: 'Beijing',
    hasCar: true,
    zipcode: null};

JavaScript物件的鍵都是字串類型,值可以是任意資料類型。上述person物件一共定義了6個鍵值對,其中每個鍵又稱為物件的屬性,例如,person的name屬性為'Bob',zipcode屬性為null。

要取得一個物件的屬性,我們用物件變數.屬性名稱的方式:

person.name; // 'Bob'person.zipcode; // null

變數

變數的概念基本上和初中代數的方程式變數是一致的,只是在電腦程式中,變數不僅可以是數字,還可以是任意資料類型。

變數在JavaScript中就是用一個變數名稱表示,變數名稱是大小寫英文、數字、$和_的組合,不能用數字開頭。變數名也不能是JavaScript的關鍵字,如if、while等。申明一個變數用var語句,例如:

var a; // 申明了變數a,此時a的值為undefinedvar $b = 1; // 申明了變數$b,同時給$b賦值,此時$b的值為1var s_007 = '007'; // s_007是一個字串var Answer = true; // Answer是一個布林值truevar t = null; // t的值是null

變數名稱也可以用中文,但是,請不要給自己找麻煩。

在JavaScript中,使用等號=對變數進行賦值。可以把任意資料型別賦值給變量,同一個變數可以重複賦值,而且可以是不同型別的變量,但是要注意只能用var申明一次,例如:

var a = 123; // a的值是整数123a = 'ABC'; // a变为字符串

這種變數本身型別固定的語言稱之為動態語言,與之對應的是靜態語言。靜態語言在定義變數時必須指定變數類型,如果賦值的時候類型不匹配,就會報錯。例如Java是靜態語言,賦值語句如下:

int a = 123; // a是整數型別變量,型別用int申明a = "ABC"; // 錯誤:不能把字串賦給整型變數

和靜態語言相比,動態語言更靈活,就是這個原因。

請不要把賦值語句的等號等同於數學的等號。例如下面的程式碼:

var x = 10;
x = x + 2;

如果從數學上理解x = x + 2那無論如何是不成立的,在程式中,賦值語句先計算右邊的表達式x + 2,得到結果12,再賦給變數x。由於x之前的值是10,重新賦值後,x的值變成12。

strict模式

JavaScript在設計之初,為了方便初學者學習,並沒有強制要求用var申明變數。這個設計錯誤帶來了嚴重的後果:如果一個變數沒有通過var申明就被使用,那麼該變數就自動被申明為全域變數:

i = 10; // i现在是全局变量

在同一個頁面的不同的JavaScript檔案中,如果都不用var申明,剛好都使用了變數i,將造成變數i互相影響,產生難以調試的錯誤結果。

使用var申明的變數則不是全域變量,它的範圍被限制在該變數被申明的函數體內(函數的概念將稍後講解),同名變數在不同的函數體內互不衝突。

為了修補JavaScript這一嚴重設計缺陷,ECMA在後續規範中推出了strict模式,在strict模式下運行的JavaScript程式碼,強制通過var申明變量,未使用var申明變量就使用的,將導致運行錯誤。

啟用strict模式的方法是在JavaScript程式碼的第一行寫入:

'use strict';

這是一個字串,不支援strict模式的瀏覽器會把它當作一個字串語句執行,支援strict模式的瀏覽器會開啟strict模式運行JavaScript。

來測試你的瀏覽器是否能支援strict模式:

'use strict';
// 如果瀏覽器支援strict模式,
// 下面的程式碼將報ReferenceError錯誤:

abc = 'Hello, world';
alert(abc);
<html>
<head>
 <script>
 var age = 15;
 if (age >= 18) {
 alert('adult');
 } else {
 alert('teenager');
 }
 </script>
</head>
<body>
</body>
</html>


#
繼續學習
||
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title> RunJS 演示代码 </title> <script> var ck = function(){ var x = prompt ("输入数据: ", ""); alert(x); } </script> </head> <body> <button onclick="ck();"> 按钮 </button> </body> </html>