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

參考: winter 的重學前端


JS 中有哪些類型?

JavaScript語言的每一個值都屬于某一種數(shù)據(jù)類型通今。JavaScript語言規(guī)定了7種語言類型。語言類型廣泛用于變量、函數(shù)參數(shù)、表達式辩昆、函數(shù)返回值等場合。根據(jù)最新的語言標準旨袒,這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的這個變量)來表達這個值必孤,或者 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 類型有兩個值袱院,truefalse,它用于表示邏輯意義上的真和假瞭稼,同樣有關(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 是可以用來干嘛?

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

圖解

JS運行時類型.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市丽涩,隨后出現(xiàn)的幾起案子棺滞,更是在濱河造成了極大的恐慌,老刑警劉巖矢渊,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件继准,死亡現(xiàn)場離奇詭異,居然都是意外死亡矮男,警方通過查閱死者的電腦和手機移必,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毡鉴,“玉大人崔泵,你說我怎么就攤上這事≌2梗” “怎么了管削?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長撑螺。 經(jīng)常有香客問我含思,道長,這世上最難降的妖魔是什么甘晤? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任含潘,我火速辦了婚禮,結(jié)果婚禮上线婚,老公的妹妹穿的比我還像新娘遏弱。我一直安慰自己,他們只是感情好塞弊,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布漱逸。 她就那樣靜靜地躺著,像睡著了一般游沿。 火紅的嫁衣襯著肌膚如雪饰抒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天诀黍,我揣著相機與錄音袋坑,去河邊找鬼。 笑死眯勾,一個胖子當著我的面吹牛枣宫,可吹牛的內(nèi)容都是我干的婆誓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼也颤,長吁一口氣:“原來是場噩夢啊……” “哼洋幻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起歇拆,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鞋屈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后故觅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厂庇,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年输吏,在試婚紗的時候發(fā)現(xiàn)自己被綠了权旷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡贯溅,死狀恐怖拄氯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情它浅,我是刑警寧澤译柏,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站姐霍,受9級特大地震影響鄙麦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜镊折,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一胯府、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恨胚,春花似錦骂因、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至升熊,卻和暖如春影所,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背僚碎。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阴幌,地道東北人勺阐。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓卷中,卻偏偏與公主長得像,于是被迫代替她去往敵國和親渊抽。 傳聞我的和親對象是個殘疾皇子蟆豫,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354