Javascript高階程式設計學習筆記(三)—— JS中的資料型別(1)
前一段時間由於事情比較多,所以筆記耽擱了一段時間,從這一篇開始我會盡快寫完這個系列。
文章中有什麼不足之處,還望各位大佬指出。
JS中的資料型別
上一篇中我寫了有關JS引入的Script標籤相關的東西。
那麼這一篇,我們可以正式進入JS的世界了,emmm
前面的東西應該比較基礎,大佬們不喜勿噴。
首先學習一門語言,最開始不出意外的話應該是先了解這門語言由什麼型別的資料組成,畢竟語言都是建立在這些資料型別的基礎之上的。
在介紹資料型別之前,我先大概說一下 typeof 操作符,這是JS中判斷一個變數的資料型別的操作符,它的返回值是一個數據型別的字串。
下面我將先例舉一下,typeof 的一些值的說明,以免大家對後面的內容產生疑問。
1. typeof null === “object” 在JS中NULL被認為是空物件的引用,所以 typeof null 的值為“object”
2. 在一些低版本瀏覽器中,typeof 對正則表示式的結果為“function” ,其它情況下對正則表示式使用 typeof 的返回值為“object”
3.對未宣告的變數使用 typeof 的返回值為 “undefined”
4.對未初始化的變數使用 typeof 的返回值為 “undefined”
PS. 若使用未宣告的變數瀏覽器會報錯,但是如果對未宣告的變數使用 typeof 瀏覽器不會報錯,並且會返回“undefined”
對於第三點和第四點,為了將未宣告,和未初始化加以區別,所以我們最好在宣告變數時顯示地初始化變數,這樣就能通過 typeof 來判斷一個變數到底是未宣告,還是未初始化
下面正式開始介紹。。。
Undefined型別
該型別只有一個值 那就是 undefined
未經初始化的變數會預設取得該值
對於undefined型別,需要注意的就是,不要顯式地將變數初始化為undefined,這樣你就不能判斷這個變數是否已經宣告。
原因在上方,已做出說明
var a = undefiend;
即對於undefined不推薦上方的這種使用方式。
這一型別的主要作用是用於比較,即判斷資料的合法性,是這一型別最常見的作用
Null型別
這一型別與Undefined型別一樣,都只有一個值,那就是null
與undefined的區別在於,typeof 對於null 的返回值並不是 “null” 而是 “object”,因為null 在JS的邏輯中,通常代表一個空物件。
而null本身代表的也是一個指向空物件的指標,所以typeof的返回值為“object”
除此而外,有一個需要注意的地方就是,undefined派生自null,所以在ECMA-262的標準中,規定對於兩者的相等性測試應該返回 true
即,如下圖所示
這裡的相等,是指 == (相等操作符)因為相等操作符要遵守的規則中,做出規定 undefined等於null(其餘規則將在後面的文章中提到)
而對於全等操作符 === 雖然 undefined和null被規定為值相等,但是兩者的型別不同,一個是Undefined型別,另一個是Null型別,所以全等操作符的返回值為false
並且與Undefined不同的是,JS中推薦將一切用於報存物件的變數初始化為null,因為這樣做不僅能體現null是一個指向空物件的指標,還能對undefined加以區分
Boolean型別
該型別只有兩個值,ture、false。
要注意的是Boolean的true和false與數字的0和1沒有必然聯絡
如果說二者有什麼聯絡的話,那麼只能是兩者經過型別轉換後的值相等
這裡全等和相等的具體區別在後面的文章中會有所介紹
需要注意的是true和false是區分大小寫的,比如True代表的就是一個普通的變數,而true代表的就是boolean中的一個值
雖然boolean型別只有兩個值,但是其它所有的型別都有與Boolean值等價的值
可以通過Boolean()轉型函式將其它型別的值轉換為boolean
轉換規則如下:
資料型別 轉換為true的值 轉換為false的值
Boolean true false
String 任意非空字串 “”(空字串)
Number 任何非零值包括無窮 0和NaN
Object 任何物件 無
Undefined 無 undefined
Null 無 null
以上規則對於流控制語句同樣適用
因為 if 等流控制語句會自動執行Boolean型別轉換
Number型別
該型別使用IEEE754格式(二進位制浮點數運算標準)來表示整數和浮點數值。
在此基礎上JS定義了不同數值字面量的格式
整數值
十進位制:
預設的數值型別
var a = 55;
八進位制:
第一位必須為0,後面為八進位制資料序列(0~7)
若超出範圍JS將忽略前導零,將後面的數字當作十進位制解析
需要注意的是八進位制在嚴格模式下是無效的,支援的JS引擎會丟擲錯誤
十六進位制:
以0x開頭(a~f 可大寫可小寫),對於超出範圍的值js會丟擲錯誤
在進行運算時,八進位制和十六進位制最終都將被轉為十進位制,就如上面兩張圖所示
PS 鑑於JS中數值儲存的方式可以儲存 +0 -0 兩者被認為相等
浮點數值
對於浮點數值,即該數值中包含一個小數點,並且小數點後至少有一位數字。
雖然小數點前面可以沒有整數,但不推薦這種寫法 如:.4
在此基礎上由於儲存小數所需要的空間是儲存整數值的兩倍,因此如果小數點後沒有數字,或者該小數表示的就是一個整數(1.000)JS會將該值轉為整數
對於極大或極小的數可以使用科學技術法來表示,即
3.15e7
所表示的值為3.15*10^7
在預設情況下,JS會將小數點後帶有6個0以上的浮點數值轉為科學記數法表示
除此而外,浮點數的精度為17位小數,但是計算時的準確度遠不如整數
比如大名鼎鼎的0.1加0.2的問題
這是IEEE754的通病,並非JS特有,只要使用該標準的語言都會有這樣的舍入誤差
所以我們不能測試特定的浮點數數值,不然很可能會出現問題
如 if(a+b===0.3)
數值範圍
JS所能儲存的最小數值儲存在Number.MIN_VALUE 中大多數瀏覽器中,該值為5e-324
最大值儲存在Number.MIN_VALUE中 大多數瀏覽器中該值為 1.7976931348623157e+308
超出這個範圍就會轉為Infinity,該值無法用於計算,如果計算的值返回了Infinity那麼將不能參與下一次的運算
如果Infinity參與了運算,具體情況視操作符而定,後面的文章會講到
判斷一個值是否為Infinity,可以使用isFinite()函式進行判斷
NaN
這中型別是一個特殊的值,(Not a Number)即’不是一個數字‘
用於表示,本來要返回一個數值,但返回的不是一個數值的情況,這樣就可以避免丟擲錯誤了,從而避免影響程式碼的執行。
NaN有兩個特點,首先任何涉及NaN的操作都會返回NaN
其次,NaN與任何值都不相等,包括NaN本身
為了判斷NaN這一值,JS提供了isNaN()函式,
該函式接收任何值,函式會嘗試將該值轉為數值,任何不能轉為數值的值都會返回true
關於對物件的轉換,跟Number()方法的規則一致
下方將會介紹
數值轉換
有三個方法可以將非數值轉換為數值
Number()可用於任意資料型別
parseInt()專用於字串轉數值
parseFloat()專用於字串轉數值
Number():
對於Boolean型別 true 轉為 1 ,false 轉為 0
對於Number型別 僅僅是值的傳入和傳出,不做處理
對於Null型別 返回0
對於Undefined型別 返回NaN
對於String型別 :
1.只包含數字,將其轉為十進位制數值,忽略前導零
2.包含有效的浮點數格式,將其轉為浮點數,同樣會忽略前導零
3.包含有效的十六進位制的格式,轉為十進位制數字
4.空字串轉為 0
5.不是上述中的任意一種轉為NaN
對於Object型別:
首先呼叫物件的Valueof()方法,若其返回值按照上方的規則可以轉為數字,那麼返回轉換後的數字(包括NaN),如不能返回數字則呼叫值的toString()進行轉換,規則同上,若仍不能轉為數字則報錯,能轉換則返回轉換後的數字(包括NaN)
例子如下:
我們在看一下如果將toString’改為返回一個物件看看是否會報錯
該報錯的大概意思為,不能將該物件轉換為原始資料型別
parseInt()
由於Number()的處理較為複雜且有些不合理,所以將字串轉為整數時最好使用parseInt()
轉換規則如下:
1.若第一個字元不是數字或者正負號則返回NaN
2.若滿足1則繼續解析下一個字元,直到不為數字為止,然後以這一部分數字作為十進位制的值返回
如 “123lhy” 則返回123
除此而外,該函式還能夠解析八進位制和16進位制,對於八進位制由於會產生歧義,所以最好使用第二個引數,來設定轉換使用的基數,即使用多少進位制
Number.parseInt('123',16);
parseFloat()
解析規則與parseInt()類似
遇到第一個無效的浮點數位停止
需要注意的地方在於該方法只解析十進位制數,也不提供第二個引數設定基數
除此而外如果數值可以解析為整數,那麼會返回一個整數