JavaScript定義了幾種數(shù)據(jù)類型砾脑?哪些是原始類型惨撇?原始類型和復(fù)雜類型的區(qū)別是什么葵萎?
ECMAScript中有5種簡單數(shù)據(jù)類型(也稱為基本數(shù)據(jù)類型):Undefined,Null,Boolean,Number,String.
其中Boolen,Number,String為原始數(shù)據(jù)類型分蓖,Undefined,Null一般將其看為特殊值异吻。
1種復(fù)雜數(shù)據(jù)類型:Object.
Object本質(zhì)上是由一組無序的名值對組成的裹赴。
ES6中新出了一個Symbol類型。
ECMAScirpt不支持任何創(chuàng)建自定義類型的機(jī)制,而所有值最終都將是上述7種數(shù)據(jù)類型之一棋返。
- Unndefined類型:該類型只有一個值延都,即特殊的
undefined
。在使用var
聲明變量但未對其加以初始化時睛竣,這個變量的值就是undefined
窄潭。無論在什么情況下都沒有必要把一個變量的值顯式地設(shè)置為undefined
。 - Nunll類型:該類型同樣只有一個值酵颁,即
null
嫉你。從邏輯角度來看,null
表示一個空的之爭對象躏惋,而這也正式使用typeof
操作符檢測null
值時會返回object
的原因幽污。事實(shí)上,undefined值是派生自null值的簿姨。如下所示:
alert( null == undefined); //true
盡管null
與undefined
有這樣的關(guān)系距误,但它們的用途完全不同。只要意在保存對象的變量還沒有真正保存對象扁位,就該明確的讓該變量保存null
值准潭。這樣不僅可以體現(xiàn)null作為空對象指針的慣例,而且也有助于進(jìn)一步區(qū)分null
和undefined
域仇。
- Boolean類型:該類型有兩個值:
true
和false
刑然,并且著兩個值是區(qū)分大小寫的。ECMAScript中所有類型的值都有與這兩個Boolean值等價的值暇务,這些轉(zhuǎn)換規(guī)則對理解流控制語句(如if語句)自動執(zhí)行相應(yīng)的Boolean轉(zhuǎn)換非常重要:
數(shù)據(jù)類型 | 轉(zhuǎn)換為true的值 | 轉(zhuǎn)換為false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | " "(空字符串) |
Number | 任何非零數(shù)字值(包括無窮大) | 0 和 NAN |
Object | 任何對象 | null |
Undefined | n/a(不適用) | undefined |
- Number類型:最基本的數(shù)值字面量格式是十進(jìn)制整數(shù)泼掠,整數(shù)還可以通過八進(jìn)制、十六進(jìn)制來表示垦细,如下寫法:
var intNum = 55; 十進(jìn)制整數(shù)
var octalNum1 = 070; 八進(jìn)制整數(shù)——56择镇,第一位必須是 0 然后是八進(jìn)制數(shù)字序列(0-7)
var octalNum2 = 079; 無效的八進(jìn)制數(shù)值,解析為十進(jìn)制79
var hexNum1 = 0xA; 十六進(jìn)制整數(shù)——10括改,前兩位必須是0x腻豌,后跟任何十六進(jìn)制數(shù)字。其中嘱能,字母A~F可以大寫也可以小寫吝梅。
var hexNum2 = 0x1f; 十六進(jìn)制整數(shù)——31
在進(jìn)行算數(shù)計(jì)算時,所有以八進(jìn)制和十六進(jìn)制表示的數(shù)值最終都將被轉(zhuǎn)換為十進(jìn)制數(shù)值焰檩。
Number類型中也包含了浮點(diǎn)數(shù)憔涉。所謂浮點(diǎn)數(shù)就是該數(shù)值中必須包含一個小數(shù)點(diǎn),并且小數(shù)點(diǎn)后面必須至少有一個數(shù)字析苫,雖然小數(shù)點(diǎn)前面可以沒有整數(shù)兜叨,但是不推薦這種寫法穿扳。
ECMASctipt中通常會將小數(shù)點(diǎn)后面帶有6個零以上的浮點(diǎn)數(shù)值轉(zhuǎn)換為以 e 表示法表示的數(shù)值(如0.0000003會被轉(zhuǎn)換成3e-7)。
浮點(diǎn)數(shù)值最高精度是17位小數(shù)国旷,但在進(jìn)行算數(shù)計(jì)算時其精確度遠(yuǎn)遠(yuǎn)不如整數(shù)矛物。例如:
var a = 0.1;
var b = 0.2;
alert(a+b); //0.30000000000000004
在大多數(shù)瀏覽器中能保存的最小數(shù)值為5e-324;最大數(shù)值為1.7976931348623157e+308跪但。如果計(jì)算結(jié)果超出了這兩個值履羞,那么這個數(shù)值將自動轉(zhuǎn)換為特殊的Infinity值,正無窮為Infinity
屡久,負(fù)無窮為-Infinity
忆首。Infinity是不能參與計(jì)算的數(shù)值,用isFinite()
函數(shù)可以測試一個數(shù)值是否在最大和最小數(shù)值之間被环,如果在則返回true
糙及。
NaN,即非數(shù)值(Not a Number)是一個特殊的數(shù)值筛欢,這個數(shù)值用于表示一個本來要返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況(這樣就不會拋出錯誤了)浸锨。任何涉及到NaN的操作都會返回NaN,并且NaN與任何值都不相等版姑,包括NaN本身柱搜。通過isNaN()函數(shù)可以確定一個參數(shù)是否“不是數(shù)值”。
alert(isNaN(NaN)); //true
alert(isNaN(10)); //false(10是一個數(shù)值)
alert(isNaN("10")); //false (可以被轉(zhuǎn)換為數(shù)值10)
alert(isNaN("blue")); //true (不可以被轉(zhuǎn)換成數(shù)值)
alert(isNaN(true)); //false (可以被轉(zhuǎn)換成數(shù)值1)
String類型:用于表示由零個或多個16位Unicode字符組成的字符序列剥险,即字符串聪蘸。字符串可以由雙引號或單引號表示。但是雙引號開頭必須雙引號結(jié)尾炒嘲,單引號開頭單引號結(jié)尾宇姚。ECMAScript中字符串是不可變的,一旦創(chuàng)建夫凸,它們的值不可改變。必須通過銷毀—重新填充阱持,才能改變字符串的值夭拌。
Object類型:Object類型就是一組數(shù)據(jù)和功能的集合。在ECMAScript中Object類型是所有它的實(shí)例的基礎(chǔ)衷咽。換句話說鸽扁,Object類型所具有的任何屬性和方法也同樣存在與更具體的對象中。
最新出了個Symbol的數(shù)據(jù)類型镶骗,其意義是生成一個全局唯一的值桶现。
Symbol參考地址