JavaScript數據類型
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表示一個空對象指針,所以用typeof檢測其類型會返回object。
undefined值派生自null值,因此null與undefined之間的相等操作符(==)返回true。但因其類型不一樣,全等操作符(===)返回false。
Boolean
布爾類型只有兩個值:true和false。區分大小寫。
可以通過調用Boolean()函數把一個值轉換為其對應的Boolean值。轉換規則為:
如果值為String類型,非空字符串轉換為true,空字符串轉換為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);
如果只包含有效的十六進制格式,則將其轉換成相同大小的十進制整數;
空字符串轉換為0;
若包含除上述格式之外的字符,則轉換為NaN。
若為對象,則調用對象的valueOf()然后依照前面的規則進行轉換,如果valueOf()方法未定義(即其實現是繼承自object的默認實現),則調用對象的toString()方法再依照前面的規則轉換。
parseInt()函數轉換規則:
parseInt()函數在執行轉換時會忽略字符串前面的空格,直到找到第一個非空格字符。如果第一個字符不是數字或負號,會返回NaN(轉換空字符串返回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()----返回對象的字符串、數值或布爾值表示。
網上見到的一個測試題
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

浙公網安備 33010602011771號