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); // undefined
alert(message); // undefined
//var message2;
alert(typeof message2); // undefined
alert(message2); // 錯誤
3,Null類型
null值表示一個空對象指針,它也隻有一個值null。
alert(typeof null); // object
alert(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")); // true
alert(isNaN(0070)); // false
alert(isNaN("00070")); // false
alert(isNaN(0x70)); // false
alert(isNaN("0x70")); // false
alert(isNaN(false)); // false
alert(isNaN("")); // false
alert(isNaN(NaN)); // true
6,數值轉換:Number(),parseInt(),parseFloat()
Number()可以對任何類型的參數進行轉換,轉換規則如下:
Boolean類型true轉為1,false轉為0;
Number類型,直接返回;
undefined返回NaN;
String類型,空字符串轉為0,數值類型的字符串會忽略所有前置的0轉為相應的整型或浮點型,因此八進制將會被忽略,如果是ox開頭的數字字符串,將按十六進制數處理轉為相對應的十進制數,其它轉為NaN;
object類型,null返回0,其它會調用該對象的valueOf()對其返回值操作,如果返回NaN,再調用其toString()方法,測定返回值。
alert(Number("1234asdf")); // NaN
alert(Number("00070")); // 70
alert(Number("false")); // 0
alert(Number("")); // 0
parseInt()和parseFloat隻對字符串參數操作。
parseInt()的轉化規則:
它會忽略前面所有的空格,從第一個不是空格的字符開始轉化,如果這個字符不是數字或者負號,將返回NaN;或者繼續轉化下一位置,直到下一個不是數字的位置或者結束位置。這樣如“1234abcd”將返回1234,“”返回NaN,”12.3“返回12。
alert(parseInt("1234abcd")); // 1234
alert(parseInt("")); // NaN
alert(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")); // 1234
alert(parseFloat("")); // NaN
alert(parseFloat("12.34")); // 12
alert(parseFloat("12.34.22")); // 12.34
alert(parseFloat("0x23")); // 0
alert(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()返回值一樣。
摘自 for certain