ECMAScript中有5種基本數據類型,分別是:Undefined,Null,Boolean,Number和String,還有一種複雜數據類型Object,Object本質上是由一組無序的名值對組成的。(這裏就不細細講述了)
typeof操作符
typeof操作符是負責檢測給定變量的數據類型,下面是幾個使用typeof操作符的例子
這說明typeof操作符可以是變量,可以是數值字面量。注意,typeof是一個操作符而不是一個函數,因此例子中的圓括號儘管可以使用,但不是必須的。
調用typeof null會返回Object,因爲特殊值null被認爲是一個空的對象引用。
1、Undefined類型
Undefined類型 只有一個值,即特殊的undefined。在使用var 聲明但未對其加以初始化時,這個變量的值就是undefined(默認獲得的)。var message; 只是指針指向了undefined 。
var message;
alert(message==undefined); //true
但是,包含undefined值的變量與尚未定義的變量還是不一樣的。(尚未定義的變量是空指針,沒有在內存中分配任何空間所以報錯)
var message; //這個變量聲明之後默認取得了undefined值
//var age; //該變量未聲明
alert(message); //undefined
alert(age); //報錯
2、Null類型
Null類型是第二個只有一個值的數據類型,這個值就是null 。從邏輯角度看,null值便是一個空對象指針,所以在用typeof操作符檢測時會返回object
var book=null;
alert(typeof book); //object
注意,如果定義的變量準備在將來用於保存對象,那麼最好將該變量初始化爲null而不是其他值。這樣的話,只要直接檢查null值就可以知道相應的變量是否已經保存了一個對象的引用。
3、Boolean類型
Boolean類型只有兩個字面值:true和false,這兩個值是區分大小寫的,也就是說,True和False都不是Boolean值,只是標識符。
在ECMAScript中要將一個值轉換爲一個Boolean值,可以使用轉型函數Boolean()
4、Number類型
最基本的數值字面量格式是十進制整數,十進制整數可以向下面那樣直接在代碼中輸入
var intNum=55;
除了十進制表示外,還可以通過八進制和十六進制來表示。其中,八進制字面值得第一位必須是0,然後是八進制數字序列(0~7)。如果後接的字面值超出範圍,則前面的導零失效,後面的值將被當做十進制數值解析。
var a=065; //八進制的53
var b=085; //85
var c=08; //8
alert(a);
alert(b);
alert(c);
八進制字面量在嚴格模式下是無效的,會導致支持該模式的JavaScript引擎拋出錯誤。
十六進制字面值的前兩位必須是0x,後跟任何十六進制數字(0-9及A-F)。字母可以大小寫。
var a=0xA;
var b=0x1f;
console.log(a);//十六進制的10
console.log(b);//十六進制31
在進行算術計算時,所有以八進制和十六進制表示的數值最終會被轉換成十進制數值。
浮點數值
浮點數值就是指該數值中必須包含一個小數點,並且小數點後面必須至少有一位數字。雖然小數點前面可以沒有整數但不推薦。
var floatNum1=1.2;
var floatNum2=0.2;
var floatNum3=.2;
console.log(floatNum1);//1.2
console.log(floatNum2);//0.2
console.log(floatNum3);//0.2 雖然小數點前面可以沒有整數但不推薦
由於保存浮點數值需要的內存空間是保存整數數值的兩倍,所以ES會將浮點數值轉換爲整數值。如果小數點後面沒有跟任何數字,會解析成整數保存。如果浮點數值本身表示的就是一個整數,那麼該數值就會被轉換爲整數。
var floatNum4=1.;
var floatNum5=10.0;
console.log(floatNum4);//小數點後沒有數字解析爲整數1
console.log(floatNum5);//10
可以用e表示法(科學計數法)表示浮點數值。e表示法指表示的數值等於e前面的數值乘以10的指數次冪。前面的數可以是整數也可以是浮點數,中間是一個大寫或小寫的字母e,後面是10的指數冪。
var floatNum6=3.1456e7;
console.log(floatNum6);//31456000
NaN
NaN,即非數值(Not a Number)是一個特殊的值。在ES中,任何數值除以非數值會返回NaN。
首先,任何涉及NaN的操作(NaN/10)都會返回NaN。其次,NaN與任何值都不相等,包括NaN本身。
console.log(NaN==NaN); //false
針對NaN的特點,ES定義了isNaN()函數。這個函數接收一個參數,該參數可以是任何類型,函數會確定這個參數是否“不是數值”。isNaN()在接收到一個值之後,會嘗試將這個值轉換爲數值。某些不是數值的值會直接轉換爲數值(如字符串“10”或者Boolean值)。 任何不能被轉換爲數值的值都會導致這個函數返回true.
console.log(isNaN(NaN)); //true
console.log(isNaN(10));//false
console.log(isNaN("10"));//false
console.log(isNaN(""));//false
console.log(isNaN("febby"));//true
console.log(isNaN(true));//false
數值轉換
有3個函數可以把非數值轉換爲數值:Number()、parseInt()、parseFloat()。第一個函數Number()可以用於任何數據類型,而另外兩個函數則專門用於把字符串轉換爲數值。
console.log(Number("Hello Febby")); //NaN
console.log(Number("")); //0
console.log(Number("000032"));//32 前導的零被忽略
console.log(Number(true));//1
parseInt()函數會忽略字符串前面的空格,直至找到第一個非空格字符。用parseInt()轉換空字符串會返回NaN(Number()對空字符返回0)。
console.log(parseInt("1234Febby"));//1234
console.log(parseInt(""));//NaN
console.log(parseInt("0xf"));//15 (十六進制)
console.log(parseInt(32.6));//32 小數點不是有效的數字字符
console.log(parseInt("075"));//75 (ES5認爲是十進制)
console.log(parseInt("70"));//70
console.log(parseInt("0xa"));//10 (十六進制)
可以爲這個函數提供第二個參數:轉換時使用的基數(即多少進制)。
console.log(parseInt("0xf",16));//15
console.log(parseInt("AF",16)); //175 如果指定了16作爲第二個參數,字符串可以不帶前面的"0x"
console.log(parseInt("AF"));//NaN
第二個參數表示按幾進制進行解析成十進制的數
//第二個參數表示按幾進制進行解析成十進制的數
console.log(parseInt("10",2));//2
console.log(parseInt("10",8));//8
console.log(parseInt("10",10));//10
console.log(parseInt("10",16));//16
parseFloat()與parseInt()類似,從第一個字符(位置0)開始解析每個字符,但是隻解析十進制值,沒有用第二個參數指定基數的用法
//parseFloat()只解析十進制值,沒有用第二個參數指定基數的用法
console.log(parseFloat("1234Febby"));//1234
console.log(parseFloat("0xa")); //0 十六進制格式的字符串會被轉換爲0
console.log(parseFloat("071")); //71
console.log(parseFloat("22.5")); //22.5
console.log(parseFloat("22.34.56")); //22.34
console.log(parseFloat("0958.2")); //958.2
console.log(parseFloat("3.145e7")); //31450000
5、String類型
String類型用於表示由零或多個16位Unicode字符(2個字節)組成的字符序列,即字符串。字符串可以有雙引號或單引號表示。
console.log("Febby");
console.log('Febby');
console.log('Febby"); //報錯
字符字面量(轉義序列)
字面量 | 含義 |
---|---|
\n | 換行(next line) |
\t | 製表(table) |
\b | 退格(backspace) |
\r | 回車(return) |
\f | 進紙(feed paper) |
\ \ | 斜槓 |
\ ’ | 單引號(’) |
\ " | 雙引號(”) |
\xnn | 以十六進制代碼nn表示的一個字符(其中n爲0~F)。例如,\x41表示"A" |
\unnn | 以十六進制代碼nnnn表示的一個字符(其中n爲0~F)。例如,\u03a3表示"Σ" |
var text="Hello Febby! \u03a3";
console.log(text); //Hello Febby! Σ
console.log(text.length);//14
字符串特點
ES中的字符串是不可變的。要改變某個變量保存的字符串,首先要銷燬原來的字符串,然後再用另一個包含新值的字符串填充該變量,這個過程是在後臺發生的。
var lang="Hello";
lang=lang+"Febby";
console.log(lang);//HelloFebby
轉換爲字符串
要把一個值轉換爲字符串有兩種方式。
第一種是 toString()方法。這個方法是返回相應的值的字符串表現。
//轉換爲字符串
var age=18;
console.log(age.toString()); //字符串"18"
數值、布爾值、對象和字符串值都有toString()方法,但null和undefined值沒有這個方法。
可以傳遞一個參數:輸出數值的基數,可以輸出以二進制、八進制、十六進制,或者其他進制格式表示的字符串值
//可以傳遞一個參數:輸出數值的基數,可以輸出以二進制、八進制、十六進制,或者其他進制格式表示的字符串值
var num=10;
console.log(num.toString());//"10"
console.log(num.toString(2));//"1010"
console.log(num.toString(8));//"12"
console.log(num.toString(10));//"10"
console.log(num.toString(16));//"a"
第二種是 String()方法。這個函數能夠將任何類型的值轉爲爲字符串。因爲null和undefined值沒有toString()方法,所以String()函數就返回了這兩個值的字面量。
console.log(String(10)); //"10"
console.log(String(true));//"true"
console.log(String(null));//"null"
console.log(String(""));//
console.log(String(undefined)); //"undefined"