參考: winter 的重學前端
JS 中有哪些類型?
JavaScript語言的每一個值都屬于某一種數(shù)據(jù)類型通今。JavaScript語言規(guī)定了7種語言類型。語言類型廣泛用于變量、函數(shù)參數(shù)、表達式辩昆、函數(shù)返回值等場合。根據(jù)最新的語言標準旨袒,這7種語言類型是:
- Undefined
- Null
- Boolean
- String
- Number
- Symbol
- Object
Undefined 和 Null
Undefined 類型只有一個值,就是
undefined
术辐,JS 中任何變量在賦值前砚尽,它的類型是 Undefined,值為undefined
辉词。一般可以用 JS 中的全局變量 undefined(就是名為undefined的這個變量)來表達這個值必孤,或者 void 運算來把任一一個表達式變成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 中的字符串是永遠無法變更的莱没,一旦字符串構(gòu)造出來初肉,無法用任何方式改變字符串的內(nèi)容,所以字符串具有值類型的特征饰躲。
Number
JavaScript中的Number類型有 264-253+3 個值牙咏。
Number 里的特殊值
- NaN,占用了 9007199254740990 個特殊值來表示NaN嘹裂,這原本是符合IEEE規(guī)則的數(shù)字妄壶;
- Infinity,無窮大寄狼;
- -Infinity丁寄,負無窮大。
+0
和 -0
不同
- 通過檢測 1/x 是 Infinity 還是 -Infinity 去區(qū)分 x 是 +0 還是 -0 泊愧。
浮點數(shù)運算的精度問題
console.log( 0.1 + 0.2 == 0.3) // false
JS 中浮點數(shù)運算的精度問題導致等式左右的結(jié)果并不是嚴格相等伊磺,而是相差了個微小的值。
正確的比較方法是使用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 是可以用來干嘛?
- 作為對象的屬性名,可以保證這個屬性名永遠不會沖突(不能用
.
運算符) - 給予開發(fā)者在 API 中為對象改寫默認行為的能力
- 操作ES6中對象內(nèi)置的 Symbols 屬性昏名,例如 Symbol.iterator 等這些內(nèi)置的 Symbol 可以 JavaScript 內(nèi)部行為
Object
Object 是 JavaScript 中最復雜的類型涮雷,也是 JavaScript 的核心機制之一。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)造器是兩用的,當跟 new 搭配時肺缕,它們產(chǎn)生對象,當直接調(diào)用時授帕,它們表示強制類型轉(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 類型坞嘀, 一個是對象類型躯护。