1. 程式人生 > >Javascript高階程式設計學習筆記(三)—— JS中的資料型別(1)

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()類似

遇到第一個無效的浮點數位停止

需要注意的地方在於該方法只解析十進位制數,也不提供第二個引數設定基數

除此而外如果數值可以解析為整數,那麼會返回一個整數

 

 

 
由於時間的限制,今天先介紹這四種類型,明天介紹剩下的String型別以及Object型別