閱讀590 返回首頁    go 阿裏雲 go 技術社區[雲棲]


js數據類型有哪些

JavaScript擁有動態類型,這意味著相同的變量可用作不同的類型:

當您聲明新變量時,可以使用關鍵詞 "new" 來聲明其類型;JavaScript 變量均為對象。當您聲明一個變量時,就創建了一個新的對象。

JavaScript基本數據類型

基本類型值是指簡單的數據段,基本數據類型包括:Undefined、Null、Boolean、Number、String;這5種基本類型是按值訪問的,可以操作保存在變量中的實際值;基本類型的值在內存中占據固定大小的空間,被保存在棧內存中。從一個變量向另一個變量複製基本類型的值,會創建這個值的一個副本;不能給基本類型的值添加屬性

undefined

Undefined類型隻有一個值,就是undefined;var a <=> var a = undefined,即:使用var聲明變量但未初始化,對未初始化和未聲明的變量隻能執行一項操作,就是使用typeof操作符檢測其數據類型(但在嚴格模式下會導致錯誤),會返回undefined;undefined派生於null,故兩者"=="

undefined 出現場景:

1.已聲明未賦值的變量

2.獲取對象不存在的屬性

3.無返回值的函數的執行結果

4.函數的參數沒有傳入

5.void(expression)

undefined 轉換為其它類型

Boolean(undefined):false

Number(undefined):NaN

String(undefined):'undefined'

null

Null類型隻有一個值,就是null,邏輯角度看,null值表示一個空對象指針,使用typeof檢測時會返回object;如果定義的變量將用於保存對象,最好將該變量初始化為null;也可以通過將變量的值設置為 null 來清空變量

null 出現場景:

對象不存在時

null 轉換為其它類型

Boolean(null):false

Number(null):0

String(null):'null'

注意:null是空對象指針,而[]是空數組,{}是空對象,三者不相同;null不能添加自定義屬性

布爾類型

Boolean類型隻有兩個值:true 和 false;使用boolean()進行轉換;任何非空字符串、非零數值、非空對象轉換為true,空字符串、0、NaN、null、undefined轉換為false

Boolean 出現場景:

1.條件語句導致係統執行的隱式類型轉換

2.字麵量或變量定義

Boolean 轉換為其它類型

Number(true): 1 || Number(false) : 0

String(true):'true' || String(false):'false'

Boolean()

Boolean(undefined):false

Boolean(null):false

Boolean(非空對象包括空數組[]和空對象{}):true

Boolean(非0): true || Boolean(0和NaN):false

Boolean(非空包括空格字符串):true || Boolean(''):false

注意:true不一定等於1,false也不一定等於0

數值類型

Number分為整數和浮點數

可以通過一個值-0來將其轉換成一個數字

Number有三種字麵量格式是十進製、八進製、十六進製

1.八進製字麵值的第一位必須是0,然後是八進製數字序列(0-7),如果字麵值中的數值超出了範圍,那麼前導0將被忽略,後麵的數值被當作十進製數解析
2.八進製字麵量在嚴格模式下是無效的,會導致js拋出錯誤
3.十六進製字麵值的前兩位必須是0x,後跟十六進製數字序列,字母可大寫可小寫
4.十六進製中字麵值中的數值走出範圍,如出現g,h等會報錯
5.在進行算術計算時,所有以八進製和十六進製表示的數值最終都將被轉換成十進製數值

數值表示

1.js中可以保存正0和負0,且被認為相等

2.由於浮點型數值需要的內存空間是保存整數值的兩倍,因此js會不失時機地將浮點數值轉換成整數值,若小數點後沒有跟任何數字或者浮點值本身表示的就是一個整數,這個數值會作為整數值來保存。

3.浮點數值的最高精度是17位小數,缺陷是存在舍入誤差和無法測定特定浮點數值

4.默認情況下,js會將小數點後麵帶有6個0以上的浮點數值轉換為以科學技術法(以e為底*10的±n次冪)表示的數值

5.基於IEEE754數值的浮點計算的通病是舍入誤差的問題。如:0.1+0.2 === 0.3(15個0)4

6.js中的數值範圍是Number.MIN_VALUE(5e-324) —— Number.MAX_VALUE(1.7976931348623157e+308);如果超出正數範圍,輸出Infinity(正無窮大),超出負數範圍,輸出-Infinity(負無窮大);+-Infinity不能參與數值計算

7.Number.MAX_VALUE+1 != Infinity,因為計算機最多保存52位尾數位,保存不了1000多位,早就失去精度,即小數位全為0,所以相加不變;Number.MIN_VALUE - 1 != -Infinity,也是同樣的原因,所以結果為-1

8.可以用isFinite()來確定一個數值是不是有窮的,包含著隱式類型轉換Number()

9.用isFinite()來檢測,超出範圍用false,合法範圍內用true

10.NaN與表示非數值,NaN與任何數值都不等包括它自身,任何涉及NaN的操作都會返回NaN;通過isNaN()來檢測,如果可以轉化為數值則為false,不能則為true

11.isNaN()中包含著隱式類型轉換Number()

數值轉換

1.Number()可用於任何類型,parseInt()和parseFloat專門用於把字符串轉換成數值

2.Number()、parseInt()、parseFloat()可以接受各種進製的數字,但對於含數字的字符串並不適用

3.Number()、parseInt()、parseFloat()中數字為1.2. 會報錯,但字符串為'1.2.'則不會報錯

4.Number(true):1 || Number(false):0

Number(各種進製的數字):運算後的十進製的數字,如1.0或1.或01會以1輸出

Number(undefined):NaN

Number(null):0

Number(隻包含數字的十進製和十六進製的字符串):運算後的十進製的數字;字符串中不識別八進製,按照十進製數字處理

Number(''和' '):0

Number(其他情況的字符串):NaN

Number([]和[0]和[-0]):0

Number([數字]):運算後的數字

Number([1,2]和{}和其他對象):NaN

5.parseInt():在轉換字符串時,會忽略字符串前麵的空格,直到找到第一個非空格字符。如果第一個字符不是數字字符或者負號,parseInt()就會返回NaN。如果是,則繼續解析,直到解析完成或者遇到非數字字符。

parseInt()可以識別出各種進製的整數,但在解析八進製字麵量的字符串,ECMAscript3會解析八進製,但ECMAscript5沒有解析八進製的能力

parseInt()函數提供第二個參數,表示多少進製,如:parseInt('123',16或10或2)

parseInt(各種進製的數字):運算後的十進製的數字,如1.0或1.或01會以1輸出

因為parseInt()是專門用來處理字符串轉換數字的,所以parseInt(其他類型包括'')//NaN

parseFloat():類似於parseInt(),會忽略字符串前麵的空格,直到找到第一個非空格字符

parseFloat()隻能解析十進製字符串

parseFloat(各種進製的數字):運算後的十進製的數字,如1.0或1.或01會以1輸出

字符串類型

字符串是存儲字符(比如 "Bill Gates")的變量,由0個或多個16位unicode字符組成,單引號與雙引號不能交叉使用;可以使用length屬性訪問字符串長度,轉義序列表示一個字符,無法精確返回雙字節字符長度;字符串一旦被創建其值不能改變,若要改變必須銷毀原有字符串;
轉義序列:

\n-換行
\t-製表符
\b-空格
\r-回車符
\f-分頁符
\\-斜杠\
\'-單引號
\"-雙引號
\xnn-十六進製數n代表0-f
\unnnn-以十六進製代碼表示一個unicode字符

JavaScript解釋器認為null是屬於object數據類型的一種特殊形式,而function(){}是function類型,也就是說函數也是一種基本數據類型,而不是對象的一種特殊形式。實際上,在JavaScript中,函數是一個極容易引起誤解或引發歧義的數據類型,它可以是獨立的函數類型,又可以作為對象的方法,也可以被稱為類或構造器,還可以作為函數對象而存在等;所以function被看做是object基本數據類型的一種特殊對象,

引用數據類型

對象

1.object實例化的對象是一組數據和功能(函數)的集合;實例化對象的過程有兩種:一種是通過new操作符,一種是通過對象字麵量表示法

2.object類型是最基本的類型,可以在其基礎上繼承出更多的類型,像Array()、Date()、function()類型,都是從object繼承的,而且這些類型都在程序員使用前被默認設置了屬性和方法,而這些類型又有一個籠統的稱唿為引用類型

3.Object聲明:var o=new Object()

4.Object屬性與方法:

Constructor-保存用於創建當前對象的函數

hasOwnProperty(propertyName)-檢測給定屬性在當前對象實例中是否存在

isPrototypeOf(object)-檢測傳入的對象是否是另一個對象的原型

propertyIsEnumerable(propretyName)-檢測給定屬性是否能用for-in語句枚舉

toLocalString()-返回對象的字符串表示,該字符串與執行環境地區對應

toString()-返回對象的字符串表示

valueOf()-返回對象的字符串、數值或布爾值表示,通常與toString()的值相同

5.引用類型值是指那些可以由多個值構成的對象。js不允許直接訪問內存中的位置,也就是不能直接訪問操作對象的內存空間。在操作對象時,實際上是在操作對象的引用而不是實際的對象

6.引用類型的值是對象,保存在堆內存中,包含引用類型值的變量實際上包含的並不是對象本身,而是一個指向該對象的指針。從一個變量向另一個變量複製引用類型的值,複製的其實是指針,因此兩個變量最終都指向同一個對象

7.對於引用類型的值,可以為其添加屬性和方法,也可以改變和刪除其屬性和方法

最後更新:2017-04-18 15:00:34

  上一篇:go 方法注入(Method injection)
  下一篇:go 我們為什麼需要SDN?