首頁 >web前端 >js教程 >js資料類型詳解

js資料類型詳解

小云云
小云云原創
2018-03-22 17:22:511264瀏覽

ES5簡單資料型別(也稱為基本資料型別):Undefined、Null、Boolean、Number和String。還有1 種複雜資料類型—Object,Object 本質上是由一組無序的名值對組成的。 ECMAScript不支援任何建立自訂類型的機制,而所有值最終都將是上述6 種資料類型之一。

1. typeof 運算子-偵測給定變數的資料型別
對一個值使用typeof 運算子可能會傳回下列某個字串:
 "undefined"-如果這個值未定義;
 "boolean"—如果這個值是布林值;
 "string"—如果這個值是字串;
"number"—如果這個值是數值;
" object"—如果這個值是物件或null;
"function"—如果這個值是函數。
下面是幾個使用typeof 運算子的範例:
var message = "some string";
alert(typeof message); // "string"
alert(typeof(message)); // "string"
alert(typeof 95); // "number"
這幾個例子說明,typeof 運算子的運算元可以是變數,也可以是數值字面量。請注意,typeof 是一個運算子而不是函數,因此範例中的圓括號儘管可以使用,但不是必需的。

有時候,typeof 運算子會傳回一些令人困惑但技術上卻正確的值。例如,呼叫typeof null 會回傳"object",因為特殊值null 被認為是空的物件參考。 Safari 5 及之前版本、Chrome 7 及之前版本在對正規表示式呼叫typeof 運算子時會傳回"function",而其他瀏覽器在這種情況下會回傳"object"。從技術角度講,函數在ECMAScript 中是對象,不是一種資料型態。然而,函數也確實有一些特殊的屬性,因此透過typeof 操作符來區分函數和其他物件是有必要的。

2.1 undefined 類型

undefined 型別只有一個值,即特殊的undefined。引入這個值是為了正式區分空物件指標與未經初始化的變數。對於尚未宣告過的變量,只能執行一項操作,即使用typeof 操作符檢測其資料類型。來看下面的範例:

var message; // 這個變數宣告之後預設取得了undefined 值
alert(typeof message); // "undefined"
alert(typeof age ); // "undefined"
結果表明,對未初始化和未宣告的變數執行typeof 操作符都傳回了undefined 值。因為雖然這兩種變數從技術角度看有本質區別,但實際上無論對哪種變數也不可能執行真正的操作。

2.2 null 類型

null 類型是只有一個值的資料型別,這個特殊的值是null。從邏輯角度來看,null 值表示一個空物件指針,而這也正是使用typeof 運算子偵測null 值時會傳回"object"的原因。
如果定義的變數準備在將來用於保存對象,那麼最好將該變數初始化為null 而不是其他值。
實際上,undefined 值是衍生自null 值的,因此ECMA-262 規定對它們的相等性測試要傳回true:
alert(null == undefined); //true
這裡,位於null 和undefined 之間的相等運算子(==)總是回傳true,不過要注意的是,這個運算子會因為比較的目的而轉換其運算元。

儘管null 和undefined 有這樣的關係,但它們的用途完全不同。無論在什麼情況下都沒有必要把一個變數的值明確地設定為undefined,可是同樣的規則對null 卻不適用。換句話說,只要意在保存對象的變數還沒有真正保存對象,就應該明確地讓該變數保存null 值。這樣做不僅可以體現null 作為空物件指標的慣例,而且也有助於進一步區分null 和undefined。

2.3 boolean 類型

boolean 類型只有兩個字面上值:true 和false,區分大小寫。

轉換為false的值:  false ,""(空字串),0和NaN ,null  ,undefined

##2.4 number 類型




number 類型:整數和浮點數數值。
由於儲存浮點數值所需的記憶體空間是儲存整數值的兩倍,因此ECMAScript 會不失時機地將浮點數值轉換為整數值。顯然,如果小數點後面沒有跟任何數字,那麼這個數值就可以當作整數值來保存。
var floatNum1 = 1.; // 小數點後面沒有數字-解析為1
var floatNum2 = 10.0; // 整數-解析為10

浮點數數值的最高精確度是17 位元小數,但在進行算術計算時其精確度遠不如整數。

###關於浮點數值計算會產生捨入誤差的問題,有一點需要明確:這是使用基於IEEE754 數值的浮點計算的通病,ECMAScript 並非獨此一家;其他使用相同數值格式的語言也存在這個問題。 ###

isFinite()函數可以確定一個數值是不是有窮的(是不是位於最小和最大的數值之間)。這個函數在參數位於最小與最大數值之間時會傳回true。

NaN,即非數值(Not a Number)是一個特殊的數值,這個數值用來表示一個本來要傳回數值的運算元未傳回數值的情況(這樣就不會拋出錯誤了) 。例如,在ECMAScript 中,任何數值除以0 會傳回NaN,因此不會影響其他程式碼的執行。 NaN 本身有兩個非同尋常的特點。首先,任何涉及NaN 的操作(例如NaN/10)都會傳回NaN,這個特點在多步驟計算中都有可能導致問題。其次,NaN 與任何值都不相等,包括NaN 本身。例如,下面的程式碼會回傳false:alert(NaN == NaN);  //false
isNaN( )在接收到一個值之後,會嘗試將這個值轉換為數值。某些不是數值的值會直接轉換為數值,例如字串"10"或Boolean 值。而任何不能被轉換為數值的值都會導致這個函數回傳true。請看下面的範例:
alert(isNaN(NaN)); //true alert(isNaN("10")); //false(可以轉換成數值10)
alert(isNaN("blue ")); //true(不能轉換成數值) alert(isNaN(true)); //false(可以轉換成數值1)

isNaN()確實也適用於物件。在基於物件呼叫isNaN()函數時,會先呼叫物件的valueOf()方法,然後確定該方法傳回的值是否可以轉換為數值。如果不能,則基於這個回傳值再呼叫toString()方法,再測試回傳值。而這個過程也是ECMAScript 內建函數和操作符的一般執行流程。

數值轉換:有3 個函數可以把非數值轉換成數值:Number()、parseInt()和parseFloat()。
轉型函數Number()可以用於任何資料類型,而另兩個函數則專門用於把字串轉換成數值。這3 個函數對於同樣的輸入會有傳回不同的結果。
Number()函數的轉換規則如下:
 如果是Boolean 值,true 和false 將分別轉換為1 和0。
 如果是數字值,只是簡單的傳入和回傳。
 如果是null 值,回傳0。
 如果是undefined,則回傳NaN。
 如果是字串,請遵循下列規則:
 如果字串中只包含數字(包括前面帶正號或負號的情況),則將其轉換為十進制數值,即"1"會變成1,"123"會變成123,而"011"會變成11(注意:前導的零被忽略了);
 如果字串中包含有效的浮點格式,如"1.1" ,則將其轉換為對應的浮點數值(同樣,也會忽略前導零);
 如果字串中包含有效的十六進位格式,例如"0xf",則將其轉換為相同大小的十進制整數值;
 如果字串是空的(不包含任何字元),則將其轉換為0;
 如果字串中包含除上述格式之外的字符,則將其轉換為NaN。
 如果是對象,則呼叫對象的valueOf()方法,然後依照前面的規則轉換回傳的值。如果轉換的結果是NaN,則呼叫物件的toString()方法,然後再次依照前面的規則轉換回傳的字串值。
下面還是給幾個具體的例子吧。
var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number(true); //1
在處理整數的時候更常用的是parseInt()函數。 parseInt()函數在轉換字串時,它會忽略字串前面的空格,直到找到第一個非空格字元。如果第一個字元不是數字字元或負號,parseInt()就會回傳NaN;也就是說,用parseInt()轉換空字串會回傳NaN(Number()對空字元回傳0)。如果第一個字符是數字字符,parseInt()會繼續解析第二個字符,直到解析完所有後續字符或遇到了一個非數字字符。例如,"1234blue"會被轉換為1234,因為"blue"會被完全忽略。類似地,"22.5"會被轉換為22,因為小數點並不是有效的數字字元。
如果字串中的第一個字符是數字字符,parseInt()也能夠識別出各種整數格式。如果字串以"0x"開頭且後跟數字字符,就會將其當作一個十六進制整數;如果字串以"0"開頭且後跟數字字符,則會將其當作一個八進制數來解析。
為了更好地理解parseInt()函數的轉換規則,以下給出一些例子:
var num1 = parseInt("1234blue"); // 1234 var num2 = parseInt(""); // NaN
var num3 = parseInt("0xA"); // 10(十六進位數) var num4 = parseInt(22.5); // 22
var num5 = parseInt("070"); // 56 (八進位數) var num6 = parseInt("70"); // 70(十進位數)
var num7 = parseInt("0xf"); // 15(十六進位數)
var num = parseInt("070");//在ES5 JavaScript 引擎中,parseInt( )已經不具有解析八進位值的能力
parseInt()函數提供第二個參數:轉換時使用的基數(即多少進位) 。
var num = parseInt("0xAF", 16); //175 var num1 = parseInt("AF", 16); //175
如果指定了16 作為第二個參數,字串可以不帶前面的"0x"。 
與parseInt()函數類似,parseFloat()也是從第一個字元(位置0)開始解析每個字元。而且也是一直解析到字串結尾,或是解析到遇見一個無效的浮點數位字元為止。即字串中的第一個小數點是有效的,而第二個小數點就是無效的了,因此它後面的字串將被忽略。 "22.34.5"將會轉換為22.34。
除了第一個小數點有效之外,parseFloat()與parseInt()的第二個差異在於它總是會忽略前導的零。 parseFloat()可以辨識前面討論過的所有浮點數值格式,也包括十進制整數格式。但十六進位格式的字串則總是會被轉換成0。由於parseFloat()只解析十進制值,因此它沒有用第二個參數指定基數的用法。最後也要注意一點:如果字串包含的是一個可解析為整數的數(沒有小數點,或小數點後面都是零),parseFloat()會傳回整數。以下是使用parseFloat()轉換數值的幾個典型範例。
var num1 = parseFloat("1234blue"); //1234 (整數) var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5 var num4 = parseFloat("22.5"); //22.5 varnum44. = parseFloat("22.34.5"); //22.34
var num5 = parseFloat("0908.5"); //908.5 var num6 = parseFloat("3.125e7"); //31250000

2.5 String 類型

#ECMAScript

ECMAScript 中的字串是不可變的,也就是說,字串一旦被創建,它們的值就不能改變。例如:
var lang = "Java";
lang = lang + "Script";
以上範例中的變數lang 開始時包含字串"Java"。而第二行程式碼則把lang 的值重新定義為"JavaScript"。實現這個操作的過程如下:先建立一個能容納10 個字元的新字串,然後在這個字串中填入"Java"和"Script",最後一步是銷毀原來的字串"Java"和字串" Script",因為這兩個字串已經沒用了。
var age = 11; var ageAsString = age.toString(); // 字串"11"
var found = true; var foundAsString = found.toString(); // 字串"true"
數值、布林值、物件和字串值(沒錯,每個字串也都有一個toString()方法,該方法傳回字串的副本)都有toString()方法。但null 和undefined 值沒有這個方法。
在不知道要轉換的值是不是null 或undefined 的情況下,也可以使用轉型函數String(),這個函數能夠將任何類型的值轉換為字串。 String()函數遵循下列轉換規則:
 如果值有toString()方法,則呼叫該方法(沒有參數)並傳回對應的結果;
 如果值是null,則傳回"null";
 如果值是undefined,則傳回"undefined"。
因為null 和undefined 沒有toString()方法,所以String()函數就回傳了這兩個值的字面量。

Tip:要把某個值轉換為字串,可以使用加號運算子把它與一個字串("")加在一起。


2.6 Object 型別



ECMAScript 中的物件其實就是一組資料與功能的集合。建立:var o = new Object();
Object 的每個實例都有下列屬性和方法。
 constructor:保存著用於建立目前物件的函數。對於前面的例子而言,建構子(constructor)就是Object()。
 hasOwnProperty(propertyName):用於檢查給定的屬性在目前物件實例中是否存在。其中,作為參數的屬性名稱(propertyName)必須以字串形式指定(例如:o.hasOwnProperty("name"))。
 isPrototypeOf(object):用來檢查傳入的物件是否為傳入物件的原型。
 propertyIsEnumerable(propertyName):用來檢查給定的屬性是否能夠使用for-in 語句來列舉。與hasOwnProperty()方法一樣,作為參數的屬性名稱必須以字串形式指定。
 toLocaleString():傳回物件的字串表示,該字串與執行環境的地區對應。
 toString():傳回物件的字串表示。
 valueOf():傳回物件的字串、數值或布林值表示。通常與toString()方法的傳回值相同。

由於在ECMAScript 中Object 是所有物件的基礎,因此所有物件都具有這些基本的屬性和方法。

從技術角度講,ECMA-262 中物件的行為不一定適用於JavaScript 中的其他物件。瀏覽器環境中的對象,例如BOM 和DOM 中的對象,都屬於宿主對象,因為它們是由宿主實作提供和定義的。 ECMA-262 不負責定義宿主對象,因此宿主對象可能會也可能不會繼承Object。

3. 注意


(1)任何運算元與NaN 進行關係比較,結果都是false。 ###(2)null == undefined 會傳回true,因為它們是類似的值;但null === undefined 會傳回false,因為它們是不同類型的值。 ###

以上是js資料類型詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn