參考: winter 的重學(xué)前端
JS 中有哪些類型?
JavaScript語言的每一個值都屬于某一種數(shù)據(jù)類型。JavaScript語言規(guī)定了7種語言類型。語言類型廣泛用于變量、函數(shù)參數(shù)、表達(dá)式、函數(shù)返回值等場合。根據(jù)最新的語言標(biāo)準(zhǔn),這7種語言類型是:
- Undefined
- Null
- Boolean
- String
- Number
- Symbol
- Object
Undefined 和 Null
Undefined 類型只有一個值,就是
undefined,JS 中任何變量在賦值前,它的類型是 Undefined,值為undefined。一般可以用 JS 中的全局變量 undefined(就是名為undefined的這個變量)來表達(dá)這個值,或者 void 運算來把任一一個表達(dá)式變成undefined值。Null 類型也只有一個值,就是
null,它的語義表示空值,與undefined不同,null 是 JavaScript 關(guān)鍵字,所以在任何代碼中,都可以放心用 null 關(guān)鍵字來獲取null值。
undefined 和 null 的區(qū)別
undefined跟 null 有一定的表意差別,null 表示的是:定義了但是為空。所以,在實際編程時,我們一般不會把變量賦值為 undefined,這樣可以保證所有值為 undefined 的變量,都是從未賦值的自然狀態(tài)。
Boolean
Boolean 類型有兩個值,true 和 false,它用于表示邏輯意義上的真和假,同樣有關(guān)鍵字 true 和 false 來表示兩個值。
String
String 用于表示文本數(shù)據(jù)。String 有最大長度是 2^53 - 1。
String 是 UTF16 編碼
String 的意義并非“字符串”,而是字符串的 UTF16 編碼,我們字符串的操作 charAt、charCodeAt、length 等方法針對的都是 UTF16 編碼。所以,字符串的最大長度,實際上是受字符串的編碼長度影響的。
String 可以作為值
JavaScript 中的字符串是永遠(yuǎn)無法變更的,一旦字符串構(gòu)造出來,無法用任何方式改變字符串的內(nèi)容,所以字符串具有值類型的特征。
Number
JavaScript中的Number類型有 264-253+3 個值。
Number 里的特殊值
- NaN,占用了 9007199254740990 個特殊值來表示NaN,這原本是符合IEEE規(guī)則的數(shù)字;
- Infinity,無窮大;
- -Infinity,負(fù)無窮大。
+0 和 -0不同
- 通過檢測 1/x 是 Infinity 還是 -Infinity 去區(qū)分 x 是 +0 還是 -0 。
浮點數(shù)運算的精度問題
console.log( 0.1 + 0.2 == 0.3) // false
JS 中浮點數(shù)運算的精度問題導(dǎo)致等式左右的結(jié)果并不是嚴(yán)格相等,而是相差了個微小的值。
正確的比較方法是使用JavaScript提供的最小精度值,檢查等式左右兩邊差的絕對值是否小于最小精度
console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON) // true
Symbol
Symbol 是個啥?
Symbol 是 ES6 中引入的新類型,就像Number、String、和 Boolean 一樣。
如何創(chuàng)建 Symbol 類型
與別的原始類型不同,Symbols 沒有字面量語法(例如,String 有 '')—— 創(chuàng)建 Symbol 的唯一方式是使用全局的 Symbol 函數(shù)。記住每個被創(chuàng)建出來的symbol 值都是獨一無二的。
// 可以不用加參數(shù),加了參數(shù)以后,就等于為它們加上了描述,輸出的時候我們就能夠分清,到底是哪一個值。
let s = Symbol('test')
typeof s // "symbol"
// 每個被 Symbol() 創(chuàng)建的 symbol 都是獨一無二的
Symbol('123') === Symbol('123') // false
Symbol 是可以用來干嘛?
- 作為對象的屬性名,可以保證這個屬性名永遠(yuǎn)不會沖突(不能用
.運算符) - 給予開發(fā)者在 API 中為對象改寫默認(rèn)行為的能力
- 操作ES6中對象內(nèi)置的 Symbols 屬性,例如 Symbol.iterator 等這些內(nèi)置的 Symbol 可以 JavaScript 內(nèi)部行為
Object
Object 是 JavaScript 中最復(fù)雜的類型,也是 JavaScript 的核心機(jī)制之一。Object表示對象的意思,它是一切有形和無形物體的總稱。
JS 中的Object ?
在 JavaScript 中,對象的定義是“屬性的集合”。屬性分為數(shù)據(jù)屬性和訪問器屬性,二者都是key-value結(jié)構(gòu),key可以是字符串或者 Symbol類型。
JS 中的類與對象
JavaScript 中的“類”僅僅是運行時對象的一個私有屬性,而JavaScript中是無法自定義類型的。
基本類型與 Object 的聯(lián)系
JavaScript中的幾個基本類型,都在對象類型中有一個“親戚”。它們是:
- Number
- String
- Boolean
- Symbol
Number、String和Boolean,三個構(gòu)造器是兩用的,當(dāng)跟 new 搭配時,它們產(chǎn)生對象,當(dāng)直接調(diào)用時,它們表示強(qiáng)制類型轉(zhuǎn)換。
Symbol 函數(shù)比較特殊,直接用 new 調(diào)用它會拋出錯誤,但它仍然是 Symbol 對象的構(gòu)造器。
對象為基本類型提供的便利
日常代碼可以把對象的方法在基本類型上使用,例如:
console.log("abc".length) // 3
原因在于. 運算符提供了裝箱操作,它會根據(jù)基礎(chǔ)類型構(gòu)造一個臨時對象,使得我們能在基礎(chǔ)類型上調(diào)用對應(yīng)對象的方法。但是 3 與 new Number(3) 是完全不同的值,它們一個是 Number 類型, 一個是對象類型。
圖解
