標籤:
1、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
Number可以直接做四則運算,規則和數學一致:
1 + 2; // 3(1 + 2) * 5 / 2; // 7.52 / 0; // Infinity0 / 0; // NaN10 % 3; // 110.5 % 3; // 1.5
2、字串
字串是以單引號‘或雙引號"括起來的任意文本,比如‘abc‘,"xyz"等等。
3、布爾值
布爾值和布爾代數的表示完全一致,一個布爾值只有true、false兩種值,要麼是true,要麼是false,可以直接用true、false表示布爾值,也可以通過布爾運算計算出來,(這一點類似c語言)。
true; // 這是一個true值false; // 這是一個false值2 > 1; // 這是一個true值2 >= 3; // 這是一個false值
&& 運算是與運算
|| 運算是或運算
! 運算是非運算
比較子當我們對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
4、null和undefined
null表示一個“空”的值,它和0以及Null 字元串‘‘不同,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];
另一種建立數組的方法是通過Array()函數實現:
new Array(1, 2, 3); // 建立了數組[1, 2, 3]
然而,出於代碼的可讀性考慮,強烈建議直接使用[]。
數組的元素可以通過索引來訪問。請注意,索引的起始值為0:
5、對象
JavaScript的對象是一組由鍵-值組成的無序集合,例如:
var person = { name: ‘Bob‘, age: 20, tags: [‘js‘, ‘web‘, ‘mobile‘], city: ‘Beijing‘, zipcode: null};
JavaScript對象的鍵都是字串類型,值可以是任意資料類型。上述person對象一共定義了6個索引值對,其中每個鍵又稱為對象的屬性,例如,person的name屬性為‘Bob‘,zipcode屬性為null。
要擷取一個對象的屬性,我們用物件變數.屬性名稱的方式:
person.name; // ‘Bob‘person.zipcode; // null
6、變數
變數在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"; // 錯誤:不能把字串賦給整型變數
和靜態語言相比,動態語言更靈活,就是這個原因。
7、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);
運行代碼,如果瀏覽器報錯,請修複後再運行。如果瀏覽器不報錯,說明你的瀏覽器太古老了,需要儘快升級。
不用var申明的變數會被視為全域變數,為了避免這一缺陷,所有的JavaScript代碼都應該使用strict模式。我們在後面編寫的JavaScript代碼將全部採用strict模式。
(3)資料類型和變數