1. 程式人生 > >《JavaScript高階程式設計》——JS基本概念之資料型別

《JavaScript高階程式設計》——JS基本概念之資料型別

ECMAScript 中有五種簡單資料型別(基本資料型別):Undefined、Null、Boolean、Number 和 String。還有一種複雜資料模型:Object。

資料型別

1 typeof 操作符

typeof 用來檢測給定變數的資料型別。對一個值使用 typeof 操作符可能返回下列某個字串:

  • “undefined”——如果這個值未定義;
  • “boolean”——如果這個值是布林值;
  • “string”——如果這個值是字串;
  • “number”——如果這個值是數值;
  • “object”——如果這個值是物件或者null;
  • “function”——如果這個值是函式;

2 Undefined 型別

Undefined 型別只有一個值,即特殊的 undefined。在使用 var 宣告變數但未對其初始化時,這個變數的值就是 undefined。

  • 字面值 undefined 主要目的是用於比較。
  • 對未初始化的變數和未宣告的變數執行 typeof 操作符都會返回 undefined 值。
  • 建議顯式的初始化變數,這樣當 typeof 操作符返回 undefined 值時,我們可以知道被檢測變數還未被宣告,而不是尚未初始化。

3 Null 型別

Null 型別同樣只有一個值——特殊的值 null。從邏輯角度看,null 值表示一個空物件指標,因此使用 typeof 操作符檢測 null 值時會返回 object。

  • 如果定義的變數準備將來用於儲存物件,那麼最好將該變數初始化為 null。
  • undefined 值是派生自 null 值的,因此ECMA-262 規定對他們的相等性測試要返回 true:
    alert(null == undefined);		//true
    

4 Boolean 型別

Boolean 型別是 ECMAScript 中使用最多的一種型別,該型別只有兩個字面值:true 和 false。

  • 與數字值不是一回事,true 不一定等於 1,false 也不一定等於 0。
  • 區分大小寫,True 和 False 都不是 Boolean 值,只是識別符號。
  • 要將一個值轉換為對應的 Boolean 值,可以呼叫轉型函式 Boolean( )。對於各種型別的規則如下:
    資料型別 轉換為 true 的值 轉換為 false 的值
    Boolean true false
    String 任何非空字串 “”(空字串)
    Number 任何非零數字值(包括無窮) 0 和 NaN
    Object 任何物件 null
    Undefined 不適用 undefined

5 Number 型別

Number 型別使用 IEEE754 格式來表示整數和浮點數值。

  • 八進位制子面值第一位必須為 0 ,然後是八進位制數字序列(0~7),如果字面值中數值超出了範圍,那麼前導零將被忽略,後面的數值將被當作十進位制數值解析。
    var octalNum1 = 070;		// 八進位制的 56
    var octalNum2 = 079;		// 無效的八進位制數值——解析為 79
    var octalNum1 = 08;		// 無效的八進位制數值——解析為 8
    
  • 十六進位制字面值前兩位必須為 0x ,後跟任何十六進位制數字。

5.1 浮點數值

  • 當浮點數中小數點後沒有數字時,ECMAScript 會自動將浮點數轉換為整數。
  • 對於極大極小值可以用 e 表示法(科學計數法),例如:
    var floatNum = 3.125e7;		// 等於 31250000
    
  • 永遠不要測試某個特定的浮點數值,所有基於 IEEE754 數值的浮點計算都會出現這種問題。例如:
    alert(0.1+0.2==0.3)		// false
    

5.2 數值範圍

  • 如果某次計算的結果得到一個超出 JavaScript 數值範圍的值,那麼這個值會被自動轉換為特殊的 Infinity 值,負數會轉換為 -Infinity。
  • 判斷一個數值是不是有窮的可以通過 isFinite( )函式,有窮會返回 true。

5.3 NaN

NaN,即非數值(Not a Number)是一個特殊的數值,用於表示一個本來要返回數值的運算元未返回數值的情況。

  • 任何涉及 NaN 的操作都會返回 NaN
  • NaN 與任何值都不相等,包括 NaN 本身。
    alert(NaN == NaN);		// false
    

5.4 數值轉換

有 3 個函式可以把非數值轉換為數值:Number( )、parseInt( )、parseFloat( )。第一個可用於任何資料型別,後兩個針對字串轉換成數值。
Number( )函式轉換規則:

  • Boolean值,true 和 false 分別轉換為 1 和 0。
  • 數字值,簡單的傳入和返回。
  • null 值,返回 0 。
  • undefined 值,返回 NaN。
  • 字串:
    • 只包含數字,轉換為十進位制數字,即"123"變為 123,"011"變為 11。
    • 包含有效浮點格式,轉換為對應浮點值。
    • 包含有效十六進位制格式,轉換為對應的十進位制整數值。
    • 空串轉換為 0。
    • 除此之外轉換為 NaN。
  • 如果是物件,呼叫物件的 valueOf( )方法,再依照前面規則轉換。

parseInt( )函式轉換規則

  • 忽略字串前面的空格,找到第一個非空格字元,如果不是數字或負號,返回 NaN。如果第一個字元是數字字元,會繼續向後解析,直到沒有後續字元或者遇到非數字字元停止。例如:
    var num1 = parseInt("1234blue");		// 1234
    var num2 = parseInt("");				// NaN
    var num3 = parseInt("0xA");				// 10(十六進位制)
    var num4 = parseInt(22.5);				// 22
    
  • 這個函式提供第二個引數:轉換時使用的基數(即多少進位制)
    var num1 = parseInt("0xAF", 16);			// 175
    var num2 = parseInt("AF", 16);				// 175
    

parseFloat( )函式與parseInt( )規則類似,但是隻能解析十進位制。

6 String 型別

String 型別可以由雙引號和單引號表示,兩者沒有任何區別。

  • 轉義序列:
    字面量 含義
    \n 換行
    \t 製表
    \b 退格
    \r 回車
    \f 進紙
    \\ 斜槓
    \’ 單引號
    \" 雙引號
    \xnn 用十六進位制程式碼 nn 表示一個字元
    \unnnn 用十六進位制程式碼 nnnn 表示一個 Unicode 字元
  • 任何一個字串都可以通過 length 屬性獲得長度
  • 如果字串中包含雙位元組符,那麼 length 屬性可能會不準確
  • ECMAScript 中的字串是不可變的,要改變某個變數儲存的字串,首先要銷燬原來的字串,然後再用另一個包含新值的字串填充該變數。

轉換字串

  • toString( ):除 null 和 undefined 值外都具有toString( )方法。
  • 當數值呼叫此方法時,可以傳遞引數(輸出數值的基數)指定進位制:
    var num = 10;
    alert(num.toString());			// "10"
    alert(num.toString(2));			// "1010"
    alert(num.toString(8));			// "12"
    alert(num.toString(16));		// "a"
    
  • String( ):可以將任何型別的值轉換為字串。
    • 有 toString( )方法,呼叫 toString( )方法;
    • null 返回"null";
    • undefined 返回"undefined"。

7 Object 型別

ECMAScript 中的物件其實就是一組資料和功能的集合。物件可以通過執行 new 操作符後跟要建立的物件型別的名稱來建立。而建立 Object 型別的例項併為其新增屬性和(或)方法,就可以建立自定義物件。

var o = new Object();
var o = new Object;			// 有效,但不推薦

Object 的每個例項都具有下列屬性和方法

  • constructor: 儲存著用於建立當前物件的函式。
  • hasOwnProperty(propertyName): 用於檢查給定的屬性在當前物件例項中是否存在。
  • isPrototypeOf(Object): 用於檢查傳入的物件是否是當前物件的原型。
  • propertyIsEnumerable(propertyName): 用於檢查給定的屬效能否用 for-in 語句來列舉。
  • toLocaleString(): 返回物件的字串表示,該字串與執行環境的地區對應。
  • toString(): 返回物件的字串表示。
  • valueOf(): 返回物件的字串、數值或布林值表示。