《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(): 返回物件的字串、數值或布林值表示。