資料類型和變數(shù)
資料型別
電腦顧名思義就是可以做數(shù)學(xué)計算的機器,因此,電腦程式理所當(dāng)然地可以處理各種數(shù)值。但是,電腦能處理的遠不止數(shù)值,還可以處理文字、圖形、音訊、視訊、網(wǎng)頁等各種各樣的數(shù)據(jù),不同的數(shù)據(jù),需要定義不同的數(shù)據(jù)類型。在JavaScript中定義了以下幾種資料型別:
Number
#JavaScript不區(qū)分整數(shù)與浮點數(shù),統(tǒng)一以Number表示,以下都是合法的Number型:
123; // 整數(shù)1230.456; // 浮點數(shù)0.4561.2345e3; // 科學(xué)計數(shù)法表示1.2345x1000,等同於1234.5-99; // 負數(shù)NaN; // NaN表示Not a Number,當(dāng)無法計算結(jié)果時用NaN表示Infinity; // Infinity表示無限大,當(dāng)數(shù)值超過了JavaScript的Number所能表示的最大值時,就表示為Infinity
計算機由於使用二進制,所以,有時候用十六進位表示整數(shù)比較方便,十六進位用0x前綴和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等,它們和十進位表示的數(shù)值完全一樣。
Number可以直接做四則運算,規(guī)則和數(shù)學(xué)一致:
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個字元。
#布林值和布林代數(shù)的表示完全一致,一個布林值只有true、false兩種值,要嘛是true,要嘛是false,可以直接用true、false表示布林值,也可以透過布爾運算計算出來:true; // 這是一個true值false; // 這是一個false值2 > 1; // 這是一個true值2 >= 3; // 這是一個false值
&&運算是與運算,只有所有都為true,&&運算結(jié)果才是true:
true && true; // 這個&&語句計算結(jié)果為truetrue && false; // 這個&&語句計算結(jié)果為falsefalse && true && false; // 這個&&語句計算結(jié)果為false
false || false; // 這個||語句計算結(jié)果為falsetrue || false; // 這個||語句計算結(jié)果為truefalse || true || false; //這個||語句計算結(jié)果為true
!運算是非運算,它是一個單目運算符,把true變成false,false變成true:
! true; // 結(jié)果為false! false; // 結(jié)果為true! (2 > 5); // 結(jié)果為true
布林值常用在條件判斷中,例如:
var age = 15;if (age >= 18) { alert('adult'); } else { alert('teenager'); }
比較運算子
當(dāng)我們對Number做比較時,可以透過比較運算子得到一個布林值:
2 > 5; // false5 >= 2; // true7 == 7; // true
實際上,JavaScript允許對任意資料型別做比較:
false == 0; // truefalse === 0; // false
要特別注意相等運算??子==。 JavaScript在設(shè)計時,有兩種比較運算子:
第一種是==比較,它會自動轉(zhuǎn)換資料型別再比較,很多時候,會得到非常詭異的結(jié)果;
#第二種是===比較,它不會自動轉(zhuǎn)換資料型,如果資料型別不一致,回傳false,如果一致,再比較。
由於JavaScript這個設(shè)計缺陷,不要使用==比較,始終堅持使用===比較。
另一個例外是NaN這個特殊的Number與所有其他值都不相等,包括它自己:
NaN === NaN; // false
唯一能判斷NaN的方法是透過isNaN()函數(shù):
isNaN(NaN); // true
最後要注意浮點數(shù)的相等比較:
1 / 3 === (1 - 2 / 3); // false
這不是JavaScript的設(shè)計缺陷。浮點數(shù)在運算過程中會產(chǎn)生誤差,因為計算機無法精確表示無限循環(huán)小數(shù)。要比較兩個浮點數(shù)是否相等,只能計算它們之差的絕對值,看是否小於某個閾值:
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
null和undefined
null表示一個「空」的值,它和0以及空字串''不同,0是一個數(shù)值,''表示長度為0的字串,而null表示“空”。
在其他語言中,也有類似JavaScript的null的表示,例如Java也用null,Swift用nil,Python用None表示。但是,在JavaScript中,還有一個和null類似的undefined,它表示「未定義」。
JavaScript的設(shè)計者希望用null表示一個空的值,而undefined表示值未定義。事實證明,這並沒有什麼卵用,區(qū)分兩者的意義不大。大多數(shù)情況下,我們都應(yīng)該用null。 undefined僅在判斷函數(shù)參數(shù)是否傳遞的情況下有用。
陣列
陣列是一組依序排列的集合,集合的每個值稱為元素。 JavaScript的陣列可以包括任意資料型別。例如:
[1, 2, 3.14, 'Hello', null, true];
上述陣列包含6個元素。數(shù)組用[]表示,元素之間用,分隔。
另一種建立陣列的方法是透過Array()函數(shù)實作:
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。
要取得一個物件的屬性,我們用物件變數(shù).屬性名稱的方式:
person.name; // 'Bob'person.zipcode; // null
變數(shù)
變數(shù)的概念基本上和初中代數(shù)的方程式變數(shù)是一致的,只是在電腦程式中,變數(shù)不僅可以是數(shù)字,還可以是任意資料類型。
變數(shù)在JavaScript中就是用一個變數(shù)名稱表示,變數(shù)名稱是大小寫英文、數(shù)字、$和_的組合,不能用數(shù)字開頭。變數(shù)名也不能是JavaScript的關(guān)鍵字,如if、while等。申明一個變數(shù)用var語句,例如:
var a; // 申明了變數(shù)a,此時a的值為undefinedvar $b = 1; // 申明了變數(shù)$b,同時給$b賦值,此時$b的值為1var s_007 = '007'; // s_007是一個字串var Answer = true; // Answer是一個布林值truevar t = null; // t的值是null
變數(shù)名稱也可以用中文,但是,請不要給自己找麻煩。
在JavaScript中,使用等號=對變數(shù)進行賦值??梢园讶我赓Y料型別賦值給變量,同一個變數(shù)可以重複賦值,而且可以是不同型別的變量,但是要注意只能用var申明一次,例如:
var a = 123; // a的值是整數(shù)123a = 'ABC'; // a變?yōu)樽址?/pre>這種變數(shù)本身型別固定的語言稱之為動態(tài)語言,與之對應(yīng)的是靜態(tài)語言。靜態(tài)語言在定義變數(shù)時必須指定變數(shù)類型,如果賦值的時候類型不匹配,就會報錯。例如Java是靜態(tài)語言,賦值語句如下:
int a = 123; // a是整數(shù)型別變量,型別用int申明a = "ABC"; // 錯誤:不能把字串賦給整型變數(shù)
和靜態(tài)語言相比,動態(tài)語言更靈活,就是這個原因。
請不要把賦值語句的等號等同於數(shù)學(xué)的等號。例如下面的程式碼:
var x = 10; x = x + 2;如果從數(shù)學(xué)上理解x = x + 2那無論如何是不成立的,在程式中,賦值語句先計算右邊的表達式x + 2,得到結(jié)果12,再賦給變數(shù)x。由於x之前的值是10,重新賦值後,x的值變成12。
strict模式
JavaScript在設(shè)計之初,為了方便初學(xué)者學(xué)習(xí),並沒有強制要求用var申明變數(shù)。這個設(shè)計錯誤帶來了嚴重的後果:如果一個變數(shù)沒有通過var申明就被使用,那麼該變數(shù)就自動被申明為全域變數(shù):
i = 10; // i現(xiàn)在是全局變量在同一個頁面的不同的JavaScript檔案中,如果都不用var申明,剛好都使用了變數(shù)i,將造成變數(shù)i互相影響,產(chǎn)生難以調(diào)試的錯誤結(jié)果。
使用var申明的變數(shù)則不是全域變量,它的範(fàn)圍被限制在該變數(shù)被申明的函數(shù)體內(nèi)(函數(shù)的概念將稍後講解),同名變數(shù)在不同的函數(shù)體內(nèi)互不衝突。
為了修補JavaScript這一嚴重設(shè)計缺陷,ECMA在後續(xù)規(guī)範(fàn)中推出了strict模式,在strict模式下運行的JavaScript程式碼,強制通過var申明變量,未使用var申明變量就使用的,將導(dǎo)致運行錯誤。
啟用strict模式的方法是在JavaScript程式碼的第一行寫入:
'use strict';
這是一個字串,不支援strict模式的瀏覽器會把它當(dāng)作一個字串語句執(zhí)行,支援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>#