JS中關(guān)于類型的細(xì)節(jié)

參考: winter 的重學(xué)前端


JS 中有哪些類型?

JavaScript語言的每一個值都屬于某一種數(shù)據(jù)類型。JavaScript語言規(guī)定了7種語言類型。語言類型廣泛用于變量、函數(shù)參數(shù)、表達(dá)式、函數(shù)返回值等場合。根據(jù)最新的語言標(biāo)準(zhǔn),這7種語言類型是:

  1. Undefined
  2. Null
  3. Boolean
  4. String
  5. Number
  6. Symbol
  7. 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 類型有兩個值,truefalse,它用于表示邏輯意義上的真和假,同樣有關(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 是可以用來干嘛?

  1. 作為對象的屬性名,可以保證這個屬性名永遠(yuǎn)不會沖突(不能用. 運算符)
  2. 給予開發(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)對象的方法。但是 3new Number(3) 是完全不同的值,它們一個是 Number 類型, 一個是對象類型。

圖解

JS運行時類型.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容