JavaScript中有5種單一資料型別:Undefined、Null、Boolean、Number和String,還有一種複雜資料類型----Object.
typeof操作符
用typeof操作符可以測定給定變數的資料類型,可能會返回下列某個字串:
undefined----變數未定義或未賦值
boolean------布爾值
string--------字串
number------數值
object-------對象或null
function-----函數(函數是對象而不是資料類型,但函數有一些特殊屬性,因此作區分)
typeof操作符的運算元可以是變數,也可以是常量如34,typeof是一個操作符而不是函數,因此其後面可以加括弧也可以不加。
Undefined類型
Undefined類型只有一個值,即特殊的undefined,使用var聲明變數但未對其初始化時,這個就是的值就是undefined,不用把一個變數顯示初始化為undefined。對於未聲明的變數,如果用typeof查看其類型的話也是undefined,但聲明未賦值的變數跟未聲明的變數不一樣,如用alert輸出的話未聲明的變數會產生錯誤,對未聲明的變數只能執行typeof操作。
Null類型
Null類型同Undefined類型一樣,只有一個值,為null,從邏輯角度看,null表示一個Null 物件指標,所以用typeof檢測其類型會返回object。
undefined值派生自null值,因此null與undefined之間的相等操作符(==)返回true。但因其類型不一樣,全等操作符(===)返回false。
Boolean
布爾類型只有兩個值:true和false。區分大小寫。
可以通過調用Boolean()函數把一個值轉換為其對應的Boolean值。轉換規則為:
如果值為String類型,非Null 字元串轉換為true,Null 字元串轉換為false。
如果值為Number類型,非零值轉換為true,0和NaN轉換為false。
如果值為Object類型,非null值轉換為true,null轉換為false。
如果值為Undefined類型,則轉換為false。
當要作if條件測試時,會自動執行Boolean轉換。
Number類型
Number類型預設為十進位,可以通過加前置0表示八進位,前置0x表示十六進位。
數值可以用八進位或二六進位表示,但在進行算術計算時,都會被轉換成十進位值。
對於浮點值,如果整數部分為0,0可以省略。如0.1可以寫作.1,但為清晰起見,最好寫。如果小數部分為空白或是0,則會被轉換成整數。當小數位元過多時可以用e標記法,即前面是一個數,中間是e或E,後面接10的冪,如3.1e5表示310000,預設當小數點後面帶有6個零及以上時會自動轉換為e標記法。
Number.MIN_VALUE表示能表示的最小值。
Number.MAX_VALUE表示能表示的最大值。
如果值超出JavaScript數值範圍,則會被自動轉換成Infinity或-Infinity(負無窮),可以用isFinite表示一個數是不是有窮的。
NaN表示非數值(Not a Number),用於表示一個本來要返回數值的操作未返回數值的情況(可以防止拋出錯誤)。任何涉及NaN的操作都返回NaN,NaN與任何值都不相等,包括NaN本身,NaN==NaN返回false。isNaN函數嘗試將傳入的值轉換為數字,如果轉換不成功則返回true,否則返回fase。isNaN()也適用於對象,會調用對象的valueOf()方法,然後確定該方法返回的值是否可以轉換為數值。如果valueOf()方法未定義則調用toString()方法,(這是ECMAScript中內建函數和操作符的一般執行流程)。
有3個函數可以把非數值轉換為數值:Number()、parseInt()、parseFloat()。
Number()函數轉換規則:
若為Boolean值,true轉換為1,false轉換為0;
若為null轉換為0;
若為undeined轉換為NaN;
若為字串,按如下規則:
若只包含數字,則轉換為對應的十進位數字,能識別十六進位,如”0x11”會被轉換為17,但不識別八進位,會忽略前置0,如”011”會被轉換為11;
若只包含有效浮點格式,則將其轉換成相應的浮點值(忽略前置0);
如果只包含有效十六進位格式,則將其轉換成相同大小的十進位整數;
Null 字元串轉換為0;
若包含除上述格式之外的字元,則轉換為NaN。
若為對象,則調用對象的valueOf()然後依照前面的規則進行轉換,如果valueOf()方法未定義(即其實現是繼承自object的預設實現),則調用對象的toString()方法再依照前面的規則轉換。
parseInt()函數轉換規則:
parseInt()函數在執行轉換時會忽略字串前面的空格,直到找到第一個非空白字元。如果第一個字元不是數字或負號,會返回NaN(轉換Null 字元串返回NaN,Number()函數返回0);如果第一個字元是數字字元,則繼續解析後續字元直到解析完畢所有後續字元或遇到了一個數字字元,如”3434dfdf”會被轉換成3434,parseInt()可以識別八進位和二六進位,如parseInt(“070”)返回56,parseInt(“0xf”)返回15。
可以為parseInt()函數加第二個參數表示轉換基於的基數,如parseInt(“10”,2)會轉換成2,預設為10。
parseFloat()函數轉換規則:
類似parseInt()函數,解析至遇到無效字元(第一個小數點有效,第二個小數點無效),如果字串包含的是可解析為整數的數,parseFloat()會返回一個整數;parseFloat()不解析八進位,會忽略前置0;對於十六進位數始終返回0。
String類型
字串類型是不可變的,更改變數儲存的字串時會銷毀原來的字串,然後再用另一個包含新值的字串填充該變數。
除null和undefined外,每個值都有一個toString()方法,可以調用值的toString()方法返回一個值的字串表示。預設情況下對於數值格式會返回其十進位表示,但可以通過傳遞基數參數輸出其他進位表示,如var num=10;alert(num.toString(2));返回”1010”。
String()函數也可以把值轉換為字串,其轉換規則是:
如果值有toString方法,則調用其toString()方法;
如果值是null,返回”null”;
如果值是undefined,返回”undefined”。
String()函數只能返回數值的十進位表示。
Object類型
通過執行new操作符後跟一函數名稱來建立對象,此時此函數是建構函式,建立一個Object類型的執行個體並為其添加屬性和方法,就可以建立自訂對象,對於不給建構函式傳遞參數的情況下可以省略函數後的括弧。Object類型是所有其他對象的基礎,Object類型具有的屬性和方法也存在於其他更具體的對象中,每個對象的執行個體都具有下列屬性和方法:
constructor----儲存建立當前對象的函數;
hasOwnProperty(propertyName) ----檢查給定的屬性是否在當前對象的執行個體中(不是在原型中);
isPrototyoeOf(object) ----檢查一個對象是否是object的原型;
propertyIsEnumerable(propertyName) ----檢查給定的屬性是否能用for-in語句枚舉;
toString()----返回對象的字串表示;
valueOf()----返回對象的字串、數值或布爾值表示。
網上見到的一個測試題
1 alert(typeof(NaN));
2 //number
3 alert(typeof(Infinity));
4 //number
5 alert(typeof(null));
6 //object
7 alert(typeof(undefined));
8 //undefined
9 alert(NaN==NaN);
10 //false
11 alert(NaN!=NaN);
12 //true
13 alert(NaN>NaN);
14 //false
15 alert(null==undefined);
16 //true,undefined extends null
17 alert(null>=undefined);
18 //false
19 alert(null<=undefined);
20 //false
21 alert(null==null);
22 //true
23 alert(null!=null);
24 //false
25 alert(null!=NaN);
26 //true
27 alert(null==NaN);
28 //false
29 alert(NaN==undefined);
30 //false
31 alert(parseInt("123abc"));
32 //123
33 alert("123abc"-0);
34 //NaN
35 alert(Infinity>10);
36 //true
37 alert(Infinity>"abc");
38 //false
39 alert(Infinity==NaN);
40 //false
41 alert(true==1);
42 //true
43 alert(new String("abc")=="abc");
44 //true
45 alert(new String("abc")==="abc");
46 //false
47
48 function step(a){
49
50 returnfunction(x){
51
52 return x+a++;
53
54 }
55
56 }
57
58 var a = step(10);
59
60 var b = step(20);
61
62 alert(a(10));
63 //20
64 alert(b(20));
65 //40
66 var a="123abc";
67
68 alert(typeof(a++));
69 //number
70 alert(a);
71 //NaN