JavaScript中有6種數(shù)據(jù)類型,其中包含了5種基本數(shù)據(jù)類型和1種復(fù)雜數(shù)據(jù)類型。 · 基本數(shù)據(jù)類型:undefined、null、boolean、number和String · 復(fù)雜數(shù)據(jù)類型:Object。Object本質(zhì)是由一組無(wú)序的名值對(duì)組成的。 typeof操作符JavaScript中的變量是松散類型的,所謂松散類型,就是可以用來(lái)保存任何數(shù)據(jù)。 var i = 17; i = "hello"; // 這種做法是合法的 鑒于這種特性,因此需要一種手段來(lái)檢測(cè)變量的數(shù)據(jù)類型,typeof負(fù)責(zé)提供這種信息。對(duì)一個(gè)值使用typeof操作符將返回下列某個(gè)字符串: · "underfined" -- 這個(gè)值未定義 · "boolean" -- 這個(gè)值是布爾值 · "string" -- 這個(gè)值是字符串 · "number" -- 這個(gè)值是數(shù)值 · "object" -- 這個(gè)值是對(duì)象或null · "function" -- 這個(gè)值是函數(shù) 下面舉兩個(gè)例子,說(shuō)明typeof操作符的使用: var m = "hello"; alert(typeof m); // "string" alert(typeof 17); // "number" undefined類型undefined類型只有一個(gè)值,即特殊的undefined。在使用 var msg; alert(msg == undefined); // true 不過(guò),包含undefined值的變量與未定義的變量是不一樣的。例如: var msg; // 聲明之后未初始化,默認(rèn)值為undefined // var name; // 沒(méi)有聲明 alert(msg); // "undefined" alert(name); // 產(chǎn)生錯(cuò)誤 然而,對(duì)未初始化的變量和未聲明的變量執(zhí)行typeof操作符都會(huì)返回undefined值。例如: var msg; // 聲明之后未初始化,默認(rèn)值為undefined // var name; // 沒(méi)有聲明 alert(typeof msg); // undefined alert(typeof name); // undefined null類型null類型也是只有一個(gè)值的數(shù)據(jù)類型,這個(gè)特殊的值是null。null值表示一個(gè)空對(duì)象指針,所以用typeof操作符檢測(cè)null值時(shí)會(huì)返回“object”。例如: var human = null; alert(typeof human); // “object” 如果定義一個(gè)變量用于保存對(duì)象,最好將變量初始化為null,這樣可以直接檢測(cè)變量是否null來(lái)判斷是否保存了一個(gè)對(duì)象的引用,例如: if (human != null) { // ... } 實(shí)際上,undefined值是派生自null值的,它們的相等測(cè)試返回true. alert(null == undefined) // true boolean類型boolean只有兩個(gè)值true和false。這兩個(gè)值與數(shù)字值不是一回事,true不等于1,false不等于0。 var msg = "hello javascript"; var msgAsBoolean = Boolean(msg); alert(msgAsBoolean); 下表為各種數(shù)據(jù)類型及其轉(zhuǎn)換規(guī)則:
在if判斷中,將自動(dòng)執(zhí)行Boolean轉(zhuǎn)換。例: var msg = "hello javascript"; if (msg) { // msg會(huì)自動(dòng)執(zhí)行Boolean轉(zhuǎn)換為true alert("is true"); } number類型number類型表示整數(shù)和浮點(diǎn)數(shù)。 var intNum = 20; var octalNum1 = 030; // 八進(jìn)制的24 var hexNum = 0xA; // 十六進(jìn)制的10 在進(jìn)行算數(shù)運(yùn)算時(shí),以八進(jìn)制和十六進(jìn)制表示的數(shù)值最終都會(huì)被轉(zhuǎn)換成十進(jìn)制數(shù)值。 1.浮點(diǎn)數(shù)值所謂浮點(diǎn)數(shù)值,就是該數(shù)值中必須包含一個(gè)小數(shù)點(diǎn),并且小數(shù)點(diǎn)后面必須至少有一位數(shù)字。 var floatNum1 = 1.2; var floatNum2 = 0.3; var floatNum3 = .4; // 合法,但是不推薦 對(duì)于那些極大或極小的數(shù)值,可以用e表示法 var floatNum = 2.345e4; // 等于23450 在默認(rèn)情況下,JavaScript會(huì)將小數(shù)點(diǎn)后面帶有6個(gè)零以上的浮點(diǎn)數(shù)轉(zhuǎn)換為以e表示的數(shù)值。 if (a + b == 0.5) { // 不能做這樣的測(cè)試 alert("等于0.5"); } 2.數(shù)值范圍由于內(nèi)存的限制,JavaScript并不能表示所有的數(shù)值。 · 最小的數(shù)值:Number.MIN_VALUE,在多數(shù)瀏覽器中為5e-324 · 最大的數(shù)值:Number.MAX_VALUE,在多數(shù)瀏覽器中為1.7976931348623157e+308 如果某次計(jì)算的結(jié)果得出一個(gè)超過(guò)JavaScript數(shù)值范圍的值,那么這個(gè)值將被自動(dòng)轉(zhuǎn)換成Infinity值(正無(wú)窮)。如果是負(fù)數(shù),就會(huì)被轉(zhuǎn)換成-Infinity(負(fù)無(wú)窮);如果是正數(shù),就會(huì)被轉(zhuǎn)換成Infinity(正無(wú)窮)。Infinity不是能夠參與計(jì)算的數(shù)值。通過(guò)isFinite()函數(shù)可以確定一個(gè)數(shù)值是不是有窮的。如果是有窮的,則返回true。 var result = Number.MAX_VALUE + Number.MAX_VALUE; alert(isFinite(result)); // false 3.NaNNaN,即非數(shù)值(Not a Number)是一個(gè)特殊的值。用于表示一個(gè)本來(lái)要返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況(這樣就不會(huì)拋出錯(cuò)誤了)。在JavaScript中,任何數(shù)值除以0會(huì)返回NaN。 alert(NaN == NaN); // false 針對(duì)NaN的特點(diǎn),JavaScript定義了isNaN()函數(shù)。isNaN()函數(shù)在接收一個(gè)值后,會(huì)嘗試將這個(gè)值轉(zhuǎn)換為數(shù)值。某些不是數(shù)值的值會(huì)直接轉(zhuǎn)換為數(shù)值,如字符串"20"或Boolean值。不能轉(zhuǎn)換成數(shù)值的值都會(huì)返回true。 alert(isNaN(NaN)); // true alert(isNaN(10)); // false, alert(isNaN("10")); // false(可以被轉(zhuǎn)換成數(shù)值10) alert(isNaN("blue")); // true,不能轉(zhuǎn)換 alert(isNaN(true)); // 可以被轉(zhuǎn)換成1 4.數(shù)值轉(zhuǎn)換有三個(gè)可以將非數(shù)值轉(zhuǎn)換為數(shù)值的函數(shù):Number()、parseInt()、parseFloat()。Number()可以作用于任何類型,parseInt()和parseFloat()則專門用于把字符串轉(zhuǎn)換成數(shù)值。 o 如果是Boolean值,true和false分別轉(zhuǎn)換為1和0。 o 如果是數(shù)字值,簡(jiǎn)單地傳入和返回。 o 如果是null值,返回0 o 如果是undefined,返回NaN。 o 如果是字符串,遵循以下規(guī)則: o 如果字符串中只包含數(shù)字,則將其轉(zhuǎn)換為十進(jìn)制數(shù)值,即“20”轉(zhuǎn)換為20,“011”會(huì)轉(zhuǎn)換為11; o 如果字符串中包含有效的浮點(diǎn)格式,如“1.2”,則將其轉(zhuǎn)換為對(duì)應(yīng)的浮點(diǎn)數(shù); o 如果字符串中包含有效的十六進(jìn)制格式,例如“0xf”,則將其轉(zhuǎn)換為對(duì)應(yīng)的十進(jìn)制整數(shù); o 如果字符串是空的,則將其轉(zhuǎn)換為0; o 如果字符串中包含上述格式之外的字符,則將其轉(zhuǎn)換為NaN。 o 如果是對(duì)象,則調(diào)用對(duì)象的valueOf()方法,然后依照前面的規(guī)則轉(zhuǎn)換,如果返回的結(jié)果是NaN,則調(diào)用對(duì)象的toString()方法,然后再次依照前述規(guī)則轉(zhuǎn)換返回的字符串值。 var num1 = Number("javascript"); // NaN var num2 = Number(""); // 0 var num3 = Number("012"); // 12 var num4 = Number("0xa"); // 10 var num5 = Number(true); // 1 實(shí)際開發(fā)中,處理整數(shù)時(shí)更多的使用parseInt()函數(shù)。parseInt()函數(shù)會(huì)忽略字符串前面的空格,直至找到第一個(gè)非空字符串。如果第一個(gè)字符不是數(shù)字或符號(hào),就會(huì)返回NaN。如果第一個(gè)字符是數(shù)字字符,parseInt()就會(huì)繼續(xù)解析第二個(gè)字符,直至最后一個(gè)字符源碼交易或遇到一個(gè)非數(shù)字字符。例 如:“123hello”會(huì)被轉(zhuǎn)換為123,類似地,“12.3”會(huì)被轉(zhuǎn)換為12。 而且parseInt()函數(shù)能夠識(shí)別出各種整數(shù)格式。 var num1 = parseInt("123hello"); // 123 var num2 = parseInt(""); // 0 var num3 = parseInt("070"); // 56 var num4 = parseInt("0xa"); // 10 var num5 = parseInt("12.3"); //12 為了消除進(jìn)制帶來(lái)的困惑,可以為parseInt()函數(shù)添加第二個(gè)參數(shù),表示轉(zhuǎn)換時(shí)使用多少進(jìn)制。 var num = parseInt("0xAF", 16); // 175 parseFloat()也是從第一個(gè)字符開始解析,而且一直解析到字符末尾,或者遇見(jiàn)一個(gè)無(wú)效的浮點(diǎn)數(shù)字符,例如,“12.34.5”將會(huì)轉(zhuǎn)換為12.34,除了第一個(gè)小數(shù)點(diǎn)之外,parseFloat()與parseInt()的另一個(gè)區(qū)別是會(huì)始終忽略前導(dǎo)0。 var num1 = parseFloat("123hello"); // 123,整數(shù) var num2 = parseFloat("0xa"); // 0 var num3 = parseFloat("12.3); // 12.3 var num4 = parseFloat("12.34.5); // 12.34 var num5 = parseFloat("3.14e6"); // 3140000 String類型String類型用于表示由零或多個(gè)16位Unicode字符組成的字符序列。字符串由雙引號(hào)(")或單引號(hào)(')表示。 var str1 = "san"; var str2 = 'zhang'; 任何字符串的長(zhǎng)度都可以由 var str1 = "hello"; var str2 = "中國(guó)"; alert(str1.length); // 5 alert(str2.length); // 2 字符串是不可變的,一旦創(chuàng)建,它們的值就不可改變。改變一個(gè)變量的值,首先需要銷毀原來(lái)的值,然后再用一個(gè)新值填充變量。 var str = "good"; str = str + "morning"; 在上例中,第一行str包含了“good”,而第二行重新填充了“good”和“morning”的組合,即“goodmorning”。 要把一個(gè)值轉(zhuǎn)換為字符串有兩種方式:toString()函數(shù)和String()函數(shù)。 var age = 20; var ageAsString = age.toString(); // "20" var flag = true; var flagAsString = flag.toString(); // "true" toString()還可以傳入一個(gè)參數(shù),表示輸出數(shù)值的基數(shù)(多少進(jìn)制)。例: var num = 10; alert(num.toString()); // "10" alert(num.toString(2)); // "1010" alert(num.toString(8)); // "12",10的八進(jìn)制為形式為012,這里去掉了前導(dǎo)0 alert(num.toString(16)); // "a",去掉了前導(dǎo)0x 在不知道要轉(zhuǎn)換的是不是null或undefined的情況下,還可以使用String()函數(shù)。這個(gè)函數(shù)能夠?qū)⑷魏晤愋偷臄?shù)轉(zhuǎn)換為字符串。String()函數(shù)遵循以下規(guī)則: · 如果值有toString()方法,則調(diào)用該方法并返回結(jié)果 · 如果值是null,則返回“null” · 如果值是undefined,則返回“undefined” var str1 = null; var str2; alert(String(str1)); // "null" alert(String(str2)); // "undefined" Object類型JavaScript中的對(duì)象其實(shí)是一組數(shù)據(jù)和功能的集合。通過(guò)關(guān)鍵字 var o = new Object(); 類似于Java中的Object對(duì)象(Java中Object為所有類的基類),Object類是其他所有實(shí)例的基礎(chǔ)。也就是說(shuō),Object類型具有的任何屬性和方法也同樣存在于更具體的對(duì)象中。 每個(gè)Object實(shí)例都具有下列屬性和方法: · constructor:保存著用于創(chuàng)建當(dāng)前對(duì)象的函數(shù)。 · hasOwnProperty(propertyName):用于檢查給定的屬性在當(dāng)前對(duì)象實(shí)例中是否存在。作為參數(shù)的屬性名必須以字符串的形式指定(例如:o.hasOwnProperty("name"))。 · isPrototypeOf(object):用于檢查傳入的對(duì)象是否是傳入對(duì)象的原型。 · propertyIsEnumerable(propertyName):用于檢測(cè)給定的屬性是否能夠使用for-in語(yǔ)句來(lái)枚舉。屬性名必須以字符串的形式傳入。 · toLocalString():返回對(duì)象的字符串表示,該字符串與執(zhí)行環(huán)境的地區(qū)對(duì)應(yīng)。 · toString():返回對(duì)象的字符串表示 · valueOf():返回對(duì)象的字符串、數(shù)值或布爾值表示。通常與toString()方法的返回值相同。 |
|