js的資料類型:Number、String、Boolean、Undefined、Null和Object。我們在js裡建立的資料一定是以上幾種類型的一種。
1,typeof操作符
js提供了typeof操作符來檢測資料的類型,但是typeof操作的結果只會是:number,string,boolean,undefined,object,function中的一個,這個和提供的資料類型是不一致的。
2,undefined類型
如果一個變數聲明未賦值之前,它是undefined類型,並且有值是undefined。
要注意的是:如果我們對從未聲明過的變數,它也是undefined類型,但是對它進行取值的操作將會產生一個變數未定義的錯誤。
var message;alert(typeof message); // undefinedalert(message);// undefined//var message2;alert(typeof message2);// undefinedalert(message2);// 錯誤
3,Null類型
null值表示一個Null 物件指標,它也只有一個值null。
alert(typeof null); // objectalert(null); // null
另外要注意的undefined值是派生自null值的,就有以下的結果:
alert(undefined == null); // true
儘管如此,但他們兩個的作用完全是不一樣的,因此我們如果確定一個變數要指向對象,還沒有真正指向對象之前,應該在聲明它暫時賦值為null。
4,Boolean類型
只有兩個值ture,false,並且是區分大小寫,也就是說var isError = False;將產生錯誤。
js提供了一個Boolean(arg)的函數來將其它類型轉為Boolean類型,更有意思也值得注意的特性是js會為流程式控制制語句(如if)自動調用Boolean類型的轉換。
轉型的規則如下:
Boolean的flase,String類型的“”,Number類型的0和NaN,Object類型的null,undefined類型的undefined會被認為是false,其它都是true。
5,Number類型
可用來表示分為整數和浮點數,整數又包括八進位(0開頭)、十進位(預設)和十六進位(0x開頭)。
其中八進位如果有某位超過了7,前面的0將被忽略,被認為是十進位。如070轉為十進位是56,而018會認為是18。
浮點數值儲存空間是整數的兩倍,js會把如1.0、10.這樣的數值用轉為整數來儲存。
要注意的是,盡量不要用基於js浮點數值運算:
alert(0.1 + 0.2); // 輸出是0.30000000000000004
另外有幾個特殊的值要注意:
Number.MAX_VALUE、Number.MIN_VALUE儲存的是所能支援的最大、最小的數,如果超過這個範圍將會得到正無窮Infinity、負無窮-Infinity。我們可以用isFinite()函數來判斷一個數是不是超出了範圍。其中我們可以從Number.NEGATIVE_INFINITY、Number.POSITIVE_INFINITY得到正無窮Infinity、負無窮-Infinity。
另外還有一個要注意的值NaN,任何一個需要返回數值的運算返回的不是數值將返回NaN,它是一個特殊數值,跟任何數值的任何運算都會返回NaN,並且它不與任何值相等包括自己。
另外有isNaN()函數,來判斷傳入的任意型別參數是不是NaN。isNaN會對參數進行轉化,如果能轉化為數值,就返回false.這上轉化是對整體的一個轉化,還會把true轉為1,false轉為0.如果參數是對象,它會先調用對象的valueOf(),如果不能轉為數值,會再次調用toString()來判斷。
alert(isNaN("1234asdf")); // truealert(isNaN(0070)); // falsealert(isNaN("00070")); // falsealert(isNaN(0x70)); // falsealert(isNaN("0x70")); // falsealert(isNaN(false)); // falsealert(isNaN("")); // falsealert(isNaN(NaN)); // true
6,數值轉換:Number(),parseInt(),parseFloat()
Number()可以對任何類型的參數進行轉換,轉換規則如下:
Boolean類型true轉為1,false轉為0;
Number類型,直接返回;
undefined返回NaN;
String類型,Null 字元串轉為0,數實值型別的字串會忽略所有前置的0轉為相應的整型或浮點型,因此八進位將會被忽略,如果是ox開頭的數字字串,將按十六進位數處理轉為相對應的十進位數,其它轉為NaN;
object類型,null返回0,其它會調用該對象的valueOf()對其傳回值操作,如果返回NaN,再調用其toString()方法,測定傳回值。
alert(Number("1234asdf")); // NaNalert(Number("00070")); // 70alert(Number("false")); // 0alert(Number("")); // 0
parseInt()和parseFloat只對字串參數操作。
parseInt()的轉化規則:
它會忽略前面所有的空格,從第一個不是空格的字元開始轉化,如果這個字元不是數字或者負號,將返回NaN;或者繼續轉化下一位置,直到下一個不是數位位置或者結束位置。這樣如“1234abcd”將返回1234,“”返回NaN,”12.3“返回12。
alert(parseInt("1234abcd")); // 1234alert(parseInt("")); // NaNalert(parseInt("12.34"));// 12
與Number()不同的是,parseInt()能識別出八進位、十六進位的數值進行對應的轉化,但是在瀏覽器的實現上卻出現了問題,IE中會把070轉為70,而ff,chrome把070轉為56。前面多個0時,相當於只有一個0。
alert(parseInt("070")); // ie彈出70,ff,chrome彈出56
不過幸好javascript提供了另一個參數來決定要何種(2/8/10/16)進位數來處理。
alert(parseInt("070","8")); // 都彈出56
parseFloat()與parseInt()類似,也會逐個檢查字元,直到不是數值的字元或第二個小數點出現。
alert(parseFloat("1234abcd")); // 1234alert(parseFloat("")); // NaNalert(parseFloat("12.34")); // 12alert(parseFloat("12.34.22")); // 12.34alert(parseFloat("0x23")); // 0alert(parseFloat("0323")); // 323
6,String類型
幾乎所有的類型(null和undefined除外)都會有一個tostring()的方法,把自身轉為字串類型。
另外,數值型的toString()還可以接受一個參數(2/8/10/16),來決定按何種進位表示的字串值。
對於null和undefined調用toString()將產生錯誤,如果不確定要轉換值是不是null/undefined,可以調用String()來轉換,它會把null轉為”null“,undefined轉化為"undefined",其它與toString()一樣。
7,Object類型
此類型是一組資料和功能的集合,我們可以var o = new Object();或var o = {};來建立對象。
每個object執行個體都有一些方法/屬性:
constructor屬性:用來儲存建立當前對象的方法。
hasOwnProperty(name):可用於檢測當前對象的執行個體是否有某個屬性。
isPrototypeOf(object):用於檢測傳入的對象是不是另一對象的原型。
propertyIsEnumerable(name):用於檢測對象的這個屬性是不是可以用for-in來枚舉。
toString():返回對象的字串表示。
valueof():返回對象的字串、布爾或數值表示。通常與toString()傳回值一樣。