一 JavaScript之資料類型
js中有5種單一資料型別:Undefined、Null、Boolean、Number和String。還有一種複雜資料類型——Object。ECMAScript不支援任何建立自訂類型的機制,所有值都成為以上6中資料類型之一。
一.typeof操作符typeof操作符是用來檢測變數的資料類型。對於值或變數使用typeof操作符會返回如下字串。
| 字串 |
描述 |
| undefined |
未定義 |
| boolean |
布爾值 |
| string |
字串 |
| number |
數值 |
| object |
對象或null |
| function |
函數 |
typeof操作符可以操作變數,也可以操作字面量。雖然也可以這樣使用:typeof(box),但,typeof是操作符而非內建函數。
PS:函數在ECMAScript中是對象,不是一種資料類型。所以,使用typeof來區分function和object是非常有必要的。
二.Undefined類型
Undefined類型只有一個值,即特殊的undefined。在使用var聲明變數,但沒有對其初始化時,這個變數的值就是undefined。
var box;alert(box);
未初始化的變數與根本不存在的變數(未聲明的變數)也是不一樣的。
var box;alert(age); //age is not defined
如果typeof box,typeof age都返回的undefined。從邏輯上思考,他們的值,一個是undefined,一個報錯;他們的類型,卻都是undefined。
所以,我們在定義變數的時候,儘可能的不要只聲明,不賦值。三.Null類型
Null類型是一個只有一個值的資料類型,即特殊的值null。它表示一個Null 物件引用(指標),而typeof操作符檢測null會返回object。
var box = null;alert(typeof box);
如果定義的變數準備在將來用於儲存對象,那麼最好將該變數初始化為null。這樣,當檢查null值就知道是否已經變數是否已經分配了對象引用了。
var box = null; if (box != null) { alert('box對象已存在!'); }
說明:undefined是派生自null的,因此ECMA-262規定對它們的相等性測試返回true。
alert(undefined == null);
資料類型也必須相等,返回false
alert(undefined === null) //資料類型必須相等才可以四.Boolean類型
Boolean類型有兩個值(字面量):true和false。而true不一定等於1,false不一定等於0。
JavaScript是區分大小寫,True和False或者其他都不是Boolean類型的值。
var box = true;alert(typeof box);
顯示轉換,屬於強制性轉換
要將一個值轉換為其對應的Boolean值,可以使用轉型函數Boolean()。
var hello = 'Hello World!';var hello2 = Boolean(hello);alert(typeof hello);
隱式轉換
var hello = 'Hello World!';if (hello) { alert('如果條件為true,就執行我這條!');} else { alert('如果條件為false,就執行我這條!');}
以下是其他類型轉換成Boolean類型規則
| 資料類型 |
轉換為true的值 |
轉換為false的值 |
| Boolean |
true |
false |
| String |
任何非Null 字元串 |
Null 字元串 |
| Number |
任何非零數字值(包括無窮大) |
0和NaN |
| Object |
任何對象 |
null |
| Undefined |
|
undefined |
五.Number類型Number類型包含兩種數值:整型和浮點型。
最基本的數值字面量是十進位整數。var box = 100; //十進位整八位元值字面量,(以8為基數),前置必須是0,八進位序列(0~7)。var box = 070; //八進位,56var box = 079; //無效的八進位,自動解析為79var box = 08; //無效的八進位,自動解析為8十六進位字面量前面兩位必須是0x,後面是(0~9及A~F)。var box = 0xA; //十六進位,10var box = 0x1f; //十六進位,31浮點類型,就是該數值中必須包含一個小數點,並且小數點後面必須至少有一位元字。var box = 3.8;var box = 0.8;var box = .8; //有效,但不推薦此寫法由於儲存浮點數值需要的記憶體空間比整型數值大兩倍,因此ECMAScript會自動將可以轉換為整型的浮點數值轉成為整型。var box = 12.0; //小數點後面是0,轉成為12對於那些過大或過小的數值,可以用科學技術法來表示(e標記法)。e表示該數值的前面10的指數次冪。var box = 4.12e9; //即4120000000var box = 0.00000000412; //即4.12e-9
雖然浮點數值的最高精度是17位小數,但算術運算中可能會不精確。由於這個因素,做判斷的時候一定要考慮到這個問題(比如使用整型判斷)。
例如:alert(0.1+0.2); //0.30000000000000004
浮點數值的範圍在:Number.MIN_VALUE ~ Number.MAX_VALUE之間
alert(Number.MIN_VALUE); //最小值alert(Number.MAX_VALUE); //最大值
如果超過了浮點數值範圍的最大值或最小值,那麼就出現Infinity(正無窮)或者-Infinity(負無窮)。
var box = 100e1000; //超出範圍,Infinityvar box = -100e1000; //超出範圍,-Infinity
通過
Number.POSITIVE_INFINITY和Number.NEGATIVE_INFINITY得到Infinity(正無窮)及-Infinity(負無窮)的值。
alert(Number.POSITIVE_INFINITY); //Infinity(正無窮)alert(Number.NEGATIVE_INFINITY); //-Infinity(負無窮)
確定一個數值到底是否超過了規定範圍,可以使用isFinite()函數。如果沒有超過,返回true,超過了返回false。
var box = 100e1000;alert(isFinite(box)); //返回false或者true
NaN,即非數值(Not a Number)是一個特殊的值,這個數值用於表示一個本來要返回數值的運算元未返回數值的情況(這樣就不會拋出錯誤了)。
var box = 0 / 0; //NaNvar box = 12 / 0; //Infinityvar box = 12 / 0 * 0; //NaN
通過Number.NaN得到NaN值任何與NaN進行運算的結果均為NaNNaN與自身不相等(NaN不與任何值相等)
alert(Number.NaN); //NaNalert(NaN+1); //NaNalert(NaN == NaN) //false
ECMAScript提供了isNaN()函數,用來判斷這個值到底是不是NaN
isNaN()函數在接收到一個值之後,會嘗試將這個值轉換為數值
alert(isNaN(NaN)); //truealert(isNaN(25)); //false,25是一個數值alert(isNaN('25')); //false,'25'是一個字串數值,可以轉成數值alert(isNaN('Lee')); //true,'Lee'不能轉換為數值alert(isNaN(true)); //false true可以轉成成1
isNaN()函數也適用於對象。
在調用isNaN()函數過程中,首先會調用valueOf()方法,然後確定傳回值是否能夠轉換成數值如果不能,則基於這個傳回值再調用toString()方法,再測試傳回值。
var box = { toString : function () { return '123'; //可以改成return 'Lee'查看效果 }};alert(isNaN(box)); //false
有3個函數可以把非數值轉換為數值:Number()、parseInt()和parseFloat()
Number()函數是轉型函數,可以用於任何資料類型
alert(Number(true)); //1,Boolean類型的true和false分別轉換成1和0alert(Number(25)); //25,數值型直接返回alert(Number(null)); //0,Null 物件返回0alert(Number(undefined)); //NaN,undefined返回NaN
另外兩個則專門用於把字串轉成數值
字串轉換,應該遵循一下規則:
1.只包含數值的字串,會直接轉成成十進位數值,如果包含前置0,即自動去掉
alert(Number('456')); //456alert(Number('070')); //70
2.只包含浮點數值的字串,會直接轉成浮點數值,如果包含前置和後導0,即自動去掉
alert(Number('08.90')); //8.9
3.如果字串是空,那麼直接轉成0
alert(Number('')); //0
4.如果不是以上三種字串類型,則返回NaN
alert('Lee123'); //NaN
5.如果是對象,首先會調用valueOf()方法,然後確定傳回值是否能夠轉換成數值。如果轉換的結果是NaN,則基於這個傳回值再調用toString()方法,再測試傳回值
var box = {toString : function () { return '123'; //可以改成return 'Lee'查看效果}};alert(Number(box)); //123
由於Number()函數在轉換字串時比較複雜且不夠合理,因此在處理整數的時候更常用的是parseInt()。
parseInt() 只能轉換字串至數值
alert(parsetInt('456Lee')); //456,會返回整數部分alert(parsetInt('Lee456Lee')); //NaN,如果第一個不是數值,就返回NaNalert(parseInt('12Lee56Lee')); //12,從第一數值開始取,到最後一個連續數值結束alert(parseInt('56.12')); //56,小數點不是數值,會被去掉alert(parseInt('')); //NaN,空返回NaN
parseInt()除了能夠識別十進位數值,也可以識別八進位和十六進位
alert(parseInt('0xA')); //10,十六進位alert(parseInt('070')); //56,八進位alert(parseInt('0xALee')); //100,十六進位,Lee被自動過濾掉
ECMAScript為parseInt()提供了第二個參數,用於解決各種進位的轉換。
alert(parseInt('0xAF')); //175,十六進位alert(parseInt('AF',16)); //175,第二參數指定十六進位,可以去掉0x前置alert(parseInt('AF')); //NaN,理所當然alert(parseInt('101010101',2)); //314,二進位轉換alert(parseInt('70',8)) //56,八進位轉換
parseFloat()是用於浮點數值轉換的,和parseInt()一樣,從第一位解析到非浮點數值位置
alert(parseFloat('123Lee')); //123,去掉不是別的部分alert(parseFloat('0xA')); //0,不認十六進位alert(parseFloat('123.4.5')); //123.4,只認一個小數點alert(parseFloat('0123.400')); //123.4,去掉前後導alert(parseFloat('1.234e7')); //12340000,把科學技術法轉成普通數值
六.String類型String類型用於表示由零或多個16位Unicode字元組成的字元序列,即字串。字串可以由雙引號(“)或單引號(‘)表示
PS:在某些其他語言(PHP)中,單引號和雙引號表示的字串解析方式不同,而ECMAScript中,這兩種表示方法沒有任何區別。但要記住,必須成對出現,不能穿插使用,否則會出錯。
String類型包含了一些特殊的字元字面量,也叫逸出序列
| 字面量 |
含義 |
| \n |
換行 |
| \t |
製表 |
| \b |
空格 |
| \r |
斷行符號 |
| \f |
進紙 |
| \ |
斜杠 |
| \’ |
單引號 |
| \” |
雙引號 |
| \xnn |
以十六進位代碼nn表示的一個字元(0~F)。例:\x41 |
| \unnn |
以十六進位代碼nnn表示的一個Unicode字元(0~F)。例:\u03a3 |
ECMAScript中的字串是不可變的,
字串一旦建立,它們的值就不能改變要改變某個變數儲存的字串,首先要銷毀原來的字串,然後再用另一個包含新值的字串填充該變數
toString()方法可以把值轉換成字串
var box = 11;var box = true;alert(typeof box.toString()); // 字串類型
toString()方法一般是不需要傳參的,在數值轉成字串的時候,可以傳遞進位參數
var box = 10;alert(box.toString()); //10,預設輸出alert(box.toString(2)); //1010,二進位輸出alert(box.toString(8)); //12,八進位輸出alert(box.toString(10)); //10,十進位輸出alert(box.toString(16)); //a,十六進位輸出
如果在轉型之前不知道變數是否是null或者undefined的情況下,我們還可以使用轉型函數String(),這個函數能夠將任何類型的值轉換為字串
var box = null;alert(String(box));
PS:如果值有toString()方法,則調用該方法並返回相應的結果;如果是null或者undefined,則返回”null”或”undeinfed”
七.Object類型ECMAScript中的對象其實就是一組資料和功能的集合。
對象可以通過執行new操作符後跟要建立的物件類型的名稱來建立
var box = new Object();
Object()是物件建構,如果對象初始化時不需要傳遞參數,可以不用寫括弧,但這種方式我們是不推薦的。
Object()裡可以任意傳參,可以傳數值、字串、布爾值等
var box = new Object(2); //Object類型,值是2var age = box + 2; //可以和普通變數運算alert(age); //輸出結果,轉型成Number類型了
new操作符來建立其他類型的對象
var box = new Number(5); //new String('Lee')、new Boolean(true)alert(typeof box); //Object類型