ECMAScript 中有5種簡單數據類型(也稱為基本數據類型):Undefined,Null,Boolean,Number和String。一種復雜數據類型:object。
typeof操作符
由於js
中的變量是松散類型的,所以它提供了一種檢測當前變量的數據類型的方法,也就是typeof關鍵字.
通過typeof
關鍵字,對這5種數據類型會返回下面的值(以字符串形式顯示)undefined
---------- 如果值未定義 Undefined
boolean
---------- 如果這個值是布爾值 Boolean
string
---------- 如果這個值是字符串 String
number
---------- 如果這個值是數值類型 Number
object
---------- 如果這個值是對象或null
Object
需要注意的是typeof null
返回為object
,因為特殊值null
被認為是一個空的對象引用。
typeof是一個操作符而不是函數,圓括號可以使用但不是必須
Undefined類型
Undefined
類型只有一個值,即特殊的undefined
。
在使用var
聲明變量但未對其加以初始化時,這個變量的值就是undefined
。
聲明但未初始化與尚未定義的變量還是不一樣:
var message; //age未聲明 alert(message); //"undefined" alert(age); //產生錯誤 alert(typeof(message)); //"undefined" alert(typeof(age)); //"undefined"
Null類型
Null類型也只有一個值,這個值是特殊的null,從邏輯角度來看,null
值表示一個空對象指針,而這也正是使用typeof
操作符檢測null
時會返回object
的原因。
如果定義的變量將來准備用於保存對象,那么最好將該變量初始化為null,而不是其他值。這樣一來,只要直接檢測null
值就可以知道相應的變量是否已經保存了一個對象的引用了。
實際上,undefined值是派生自null值的,因此ECMA-262規定對它們的相等性測試要返回true。
console.log(undefined == null); //true
Boolean類型
此類型只有兩個值:true和false
注意:boolean類型的字面值true和false是區分大小寫的。
avaScript中所有類型的值都有與這兩個Boolean值等價的值。要將一個值轉換為其對應的Boolean值,可以調用類型轉換函數Boolean(),例如:
var message = 'Hello World'; var messageAsBoolean = Boolean(message);
下表列出了各種數據類型對應的轉換規則
數據類型 | 轉換為true | 轉換為false |
Boolean | true | false |
String | 任何非空字符串 | ""(空字符串) |
Number | 任何非零數字值 | 0和NaN |
Object | 任何對象 | null |
Undefined | 不適用 | undefined |
Number類型
最基本的數值字面量格式是十進制整數,十進制可以在代碼中直接輸入。
除了十進制,還可以用八進制和十六進制。
八進制字面值的第一位必須是零(0),然后八進制數字序列為(0~7),如果數字超出了0~7這個范圍,那么前導0將被忽略,后面的數值按十進制解析。
var a = 070; //八進制狀態下的56 var b = 079; //無效的八進制,解析為79 var c = 08; //無效的八進制,解析為8
八進制字面量在嚴格模式下是無效的
十六進制字面值前兩位必須是0x,后跟任何十六進制數字(0~9及A~F),字母不區分大小寫。
在算術運算時,八進制和十六進制都會被轉換成十進制數值。
1.浮點數
所謂浮點數值,就是該數值中必須包括一個小數點,並且小數點后面必須至少有一個數字。
由於保存浮點數所占用內存是整數的兩倍,所以ECMAScript會盡可能將浮點數轉換為整數。
如果小數點后沒有任何數字或浮點數本身就表示一個整數,就會被轉換為整數。
console.log(1.) //1 console.log(10.00) //10
默認情況下,ECMAScript會將小數點后面帶6個零以上的浮點數值轉換為以e表示法表示的數值。(例:0.0000003會被轉換為3e-7).
浮點數值的最高精度為17位。但算術計算精度遠不如整數。例:0.1+0.2不是0.3,而是0.30000000000000004,這個小小的舍入誤差會導致無法測試特定的浮點數值。
永遠不要測試某個特定的浮點數值。
關於浮點數值計算產生舍入誤差的問題:這是使用基於IEEE754數值的浮點計算的通病,ECMAScript並非獨此一家,其他使用相同數值語言的也存在這個問題。
2.NaN
NaN(Not a Number),即非數值是一個特殊的數值,這個數值用於表示一個本來要返回數值的操作數未返回數值的情況。
NaN本身有兩個特點:
1.任何涉及NaN的操作(例如NaN*10,NaN/10)都會返會NaN。
2.NaN與任何數值都不相等,包括NaN本身。
console.log(NaN == NaN); //false
isNaN(),判斷是否“不是數值”,這個函數接受一個參數,該參數可以是任何類型,isNaN()在接收到一個值之后,會嘗試將值轉換為數值,可以轉換的將返回false,不能轉換為數值的將會返回true。
3.數值轉換
有3個函數可以把非數值轉換為數值:number(),parseInt()和parseFloat()。
number()可以用於任何數據類型,而另外兩個函數則專門用於把字符串轉換為數值。
- 如果是Boolean,true和false將分別被轉換為1和0。
- 如果是數字值,只是簡單傳入和返回。
- 如果是null值,返會0。
- 如果是undefined,返回NaN。
- 如果是字符串則較為復雜。
parseInt()在轉換字符串的時會忽略字符串前的空格,直至找到第一個非空格字符。如果第一個字符不是數字字符或者是負號,返回NaN。
parseInt()可以接受兩個參數,第一個為要轉換的參數,第二個為基數(進制)。如果不指定基數意味着讓parseInt()自己決定如何解析,因此為了避免錯誤的解析,建議指定基數。
parseFloat()用於轉換浮點數。
String類型
String類型用於表示由零或多個16位Unicode字符組成的字符序列,即字符串。字符串可以由單引號(')或雙引號(")表示。
字符串的長度可以通過其length屬性取得。
var text = "this string length is 24"; console.log(text.length); //24
轉換字符串可以通過幾乎每個值都有的toString()方法。
var a = 11; console.log(a,typeof a); //11 "number" var b = a.toString(); console.log(b,typeof b); //11 string
object類型
ECMAScript中的對象其實就是一組數據和功能的集合。可以通過以下方式創建一個對象:
var obj = new object();