JavaScript中的資料型別
ECMAScript
迄今為止標準定義了7
種資料型別:6
種原始型別--String
、Number
、Boolean
、Undefined
、Null
和Symbol
;1
種引用型別--Object
看到這裡,你是否已經對它們瞭如指掌呢。如果你還對它們之間的定義、轉換、檢測等方面並不是那麼清楚,或者已經有些模糊。那麼,下面就讓我們一起去重新探索、溫習一遍吧
如果文章中有出現紕漏、錯誤之處,還請看到的小夥伴多多指教,先行謝過
以下↓
原始值
除Object
以外的所有型別都是不可變的(值本身無法被改變),我們稱這些型別的值為原始值
String型別
JavaScript
的字串型別用於表示文字資料.JavaScript
字串是不可更改的。這意味著字串一旦被建立,就不能被修改。但是,可以基於對原始字串的操作來建立新的字串
var a = 'hello' 複製程式碼
型別轉換:
-
toString()
var num = 2; num.toString() // '2' var found = true; found.toString() // 'true' 複製程式碼
除去null
與undefined
之外,其餘資料型別都存在toString
方法,使用會報錯
-
String()
var sym = Symbol(1); String(sym) // 'Symbol' var num = 10; String(num)// '10' var str; String(str) // 'undefined' 複製程式碼
如果值有toString
方法,則呼叫該方法並返回響應的結果
如果是null
返回'null'
如果是undefined
返回'undefined'
- 隱式轉換
var a = 3; a + ''// '3' var obj = {a: 3}; obj + '' // [object object] 複製程式碼
轉換規則和String
方法一致
Number型別
根據ECMAScript
標準,JavaScript
中只有一種數字型別:基於IEEE 754
標準的雙精度64
位二進位制格式的值(-(263 -1)
到263 -1
)
特殊的數值型別:
無窮大:+Infinity()
,-Infinity()
和NaN
(非數值,Not-a-Number
)
NaN
,非數值。是一個特殊的Number
型別,用來表示一個本來要返回數值的操作未返回數值的情況
-
任何涉及
NaN
的操作都返回NaN
-
NaN
與任何值都不相等,包括NaN
本身
40 / NaN// NaN NaN === NaN // false 複製程式碼
最基本的數值字面量格式是十進位制整數,還可以通過八進位制或十六進位制來表示。八進位制字面值的第一位必須是0
,然後是八進位制數字序列(0 ~ 7)
。十六進位制字面量的前兩位必須是0x
,後跟任何十六進位制數字(0 ~ 9 以及 a ~ f)
。其中字母可以是大寫也可以是小寫
var num1 = 070; // 八進位制的56 var num1 = 079; // 無效的八進位制,會解析為十進位制的79 var num2 = 56; // 十進位制的56 var num3 = 0x38; // 十六進位制的56 複製程式碼
型別轉化方式:Number()
、parseInt()
、parseFloat()
以及操作符隱式轉換
Boolean型別
表示一個邏輯實體,可以有兩個值:true
和false
var suc = true; var los = false; 複製程式碼
型別轉化方式:Boolean()
以及操作符隱式轉換
Undefined型別
Undefined
型別只有一個值,即特殊的undefined
。一個宣告但沒有被賦值的變數會有個預設值undefined
var a;// undefined 複製程式碼
Null型別
Null
型別也只有一個值,即特殊的null
表示一個空物件指標
var foo = null; 複製程式碼
Symbol型別
符號(Symbols)
是ECMAScript
第6
版新定義的。符號型別是唯一的並且是不可修改的
var s = Symbol() 複製程式碼
Symbol
函式前不能使用new
命令,否則會報錯。這是因為生成的Symbol
是一個原始型別的值,不是物件
Symbol
函式可以接受一個字串作為引數,表示對Symbol
例項的描述
引用型別
在ECMAScript
中,引用型別是一種資料結構,用於將資料和功能組織在一起
最常見的引用型別:物件(Object)
、陣列(Array)
、函式(Function)
、正則(RegExp)
和日期(Date)
等
引用型別與基本型別之間最大的不同
基本資料型別的值是按值訪問的,基本型別的值是不可變的
var a = 1; var b = 1; a === b// true b = a b = 2; a // 1 複製程式碼
引用型別的值是按引用訪問的,引用型別的值是可變的
var a = {}; var b = {}; a === b// false var a = {}; var b = a b.name = 'hello' a.name // hello 複製程式碼
基本包裝型別
為了便於操作基本型別值,ECMAScript
還提供了3
個特殊的引用型別:Boolean
、Number
和String
var a = new String('hello') typeof a // object 複製程式碼
引用型別與基本包裝型別的主要區別就是物件的生存期。使用new
操作符建立的引用型別的例項,在執行流離開當前作用域之前都一直儲存在記憶體當中。而自動建立的基本包裝型別的物件,則只存在於一行程式碼的執行瞬間,然後立即銷燬。這意味著我們不能在執行時給基本型別值新增屬性和方法
var s1 = 'some text'; s1.color = 'red'; s1.color // undefined // 但是這樣是可以的 var s1 = new String('some text'); s1.color = 'red'; s1.color // red 複製程式碼
不建議顯式的建立基本包裝型別的物件,因為在很多時候會造成一些讓人很迷惑的東西
var b = new Boolean(false) var c = b && true c // true 複製程式碼
這樣的情況下,b
這個變數就是Boolean
物件,所以無論在什麼情況下,它都是true
記得之前看到過這樣一個問題:
var str = 'hello' typeof str // String str instanceof String // false 複製程式碼
這裡的結果為false
的原因就是str
本質上是一個原始值,並不存在prototype
屬性
當然,這裡也涉及到了資料型別的判斷,有興趣的小夥伴可以點選這裡 檢視如何判斷JavaScript
中的資料型別