Javascript中的幾種數(shù)據(jù)類型

基本分類

  1. 基本數(shù)據(jù)類型:undefined忽冻、null、boolean此疹、number僧诚、string。
  2. 復雜數(shù)據(jù)類型:object(廣義的對象)

1. typeof 操作符

  • typeof是一個操作(運算)符蝗碎,不是函數(shù)湖笨。
  • typeof運算符可以返回一個值的數(shù)據(jù)類型,如:
    typeof 123 // "number"
    typeof '123' // "string"
    typeof false // "boolean"
    typeof undefined  // "undefined"
    typeof null // "object"
    typeof {} // "object"
    typeof [] // "object"
    typeof NaN // 'number'
    
    function f() {}
    typeof f  // "function"
    

2. Undefined 類型

  • Undefined 類型只有一個值"undefined"蹦骑。
  • 對未初始化和未聲明的變量執(zhí)行typeof都返回 undefined慈省。
  • 函數(shù)沒有返回值時,默認返回 undefined

3. Null 類型

  • Null 類型只有一個值"null"眠菇。
  • null 值表示一個空對象指針边败,所以使用typeof會返回"object";
  • undefined值是派生于null的,因此會有null == undefined //true捎废。
  • null轉(zhuǎn)為數(shù)字時笑窜,自動變成0。
  • null表示空值登疗,即該處的值現(xiàn)在為空排截。調(diào)用函數(shù)時,某個參數(shù)未設置任何值辐益,這時就可以傳入null断傲,表示該參數(shù)為空。
  • 無論在何種情況下都沒必要把一個變量顯式地設置為undefined智政,但是只要意在保存對象的變量還沒有真正保存對象艳悔,就應該明確地讓該變量保存null值。

4. Boolean 類型

  • 轉(zhuǎn)換規(guī)則是除了下面六個值被轉(zhuǎn)為false女仰,其他值都視為true猜年,包括空數(shù)組([])和空對象({})。
    • undefined
    • null
    • false
    • 0
    • NaN
    • ""或''(空字符串)

類型轉(zhuǎn)換

  1. Boolean(x)
  2. !!x

5. Number 類型

浮點數(shù)值

  • 所有數(shù)字都是以 64 位浮點數(shù)形式儲存疾忍,即使整數(shù)也是如此乔外,JavaScript 語言的底層根本沒有整數(shù)。
  • 如果浮點數(shù)本身是一個整數(shù)(如:1.0)一罩,那么該值會轉(zhuǎn)換為整數(shù)(轉(zhuǎn)成32位)(1等價于1.0)杨幼。
  • 浮點數(shù)計算會產(chǎn)生舍入誤差問題。(如:0.1 + 0.2 === 0.3不成立)

數(shù)值范圍

  • 如果一個數(shù)大于等于2的1024次方聂渊,那么就會發(fā)生“正向溢出”差购,返回Infinity
  • 如果一個數(shù)小于等于2的-1075次方(指數(shù)部分最小值-1023汉嗽,再加上小數(shù)部分的52位)欲逃,那么就會發(fā)生為“負向溢出”,返回0.
  • 判斷一個值是否有窮饼暑,使用isFinite()函數(shù)稳析。

NaN

  • 該數(shù)值表示一個本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況。
  • 0 / 0 結(jié)果為NaN弓叛。
  • NaN 與任何數(shù)值不相等彰居,包括 NaN。
  • 數(shù)組的indexOf方法內(nèi)部使用的是嚴格相等運算符撰筷,所以該方法對NaN不成立陈惰。[NaN].indexOf(NaN)
  • 使用isNaN("blue")函數(shù),任何不能被轉(zhuǎn)換為數(shù)值的值都返回 true毕籽,但是抬闯,對于空數(shù)組和只有一個數(shù)值成員的數(shù)組,isNaN 返回 false影钉。
  • 0 除以 0 也會得到 NaN画髓。

數(shù)值轉(zhuǎn)換

  1. Number()可以用于任何數(shù)據(jù)類型,parseInt()parseFloat()是專門把字符串轉(zhuǎn)換為數(shù)值平委。
  2. parseInt():
  • 它的第二個參數(shù):確定轉(zhuǎn)換時的進制奈虾。
  • 如果parseInt()的參數(shù)不是字符串,則會先轉(zhuǎn)為字符串再轉(zhuǎn)換廉赔。
  • 如果字符串的第一個字符不能轉(zhuǎn)化為數(shù)字(后面跟著數(shù)字的正負號除外)肉微,返回 NaN。
  • 對于那些會自動轉(zhuǎn)為科學計數(shù)法的數(shù)字蜡塌,parseInt()會將科學計數(shù)法的表示方法視為字符串碉纳,因此導致一些奇怪的結(jié)果。
    parseInt(1000000000000000000000.5) // 1
    // 等同于
    parseInt('1e+21') // 1
    
    parseInt(0.0000008) // 8
    // 等同于
    parseInt('8e-7') // 8
    
  1. parseFloat()
  • 只能解析十進制馏艾。
  • parseFloat()會將空字符串轉(zhuǎn)為 NaN劳曹。
  • parseFloat()方法會自動過濾字符串前導的空格奴愉。
  • 如果參數(shù)不是字符串,或者字符串的第一個字符不能轉(zhuǎn)化為浮點數(shù)铁孵,則返回 NaN锭硼。
  1. x - 0
    • x

數(shù)值的進制

  • 十進制:沒有前導0的數(shù)值。
  • 八進制:有前綴0o00的數(shù)值蜕劝,或者有前導0檀头、且只用到 0-7 的八個阿拉伯數(shù)字的數(shù)值,如果前導 0 后面有數(shù)字 8 和 9岖沛,則該數(shù)值被視為十進制暑始。
  • 十六進制:有前綴0x0X的數(shù)值。
  • 二進制:有前綴0b0B的數(shù)值婴削。

6. String 類型

  • Boolean廊镜、Number、String 都有toString()方法馆蠕,但 null 和 undefined 沒有期升。
  • 如果長字符串必須分成多行,可以在每一行的尾部使用反斜杠互躬。反斜杠的后面必須是換行符播赁,而不能有其他字符(比如空格),否則會報錯吼渡。(這種方式可讀性差容为,建議用連接運算符+)
    var longString = 'Long \
    long \
    long \
    string';
    
    longString
    // "Long long long string"
    

反斜杠轉(zhuǎn)義三種特殊用法

  1. \HHH:反斜杠后面緊跟三個八進制數(shù)(000到377),代表一個字符寺酪。HHH對應該字符的 Unicode 碼點坎背,比如\251表示版權(quán)符號。顯然寄雀,這種方法只能輸出256種字符得滤。
  2. \xHH:\x后面緊跟兩個十六進制數(shù)(00到FF),代表一個字符盒犹。HH對應該字符的 Unicode 碼點懂更,比如\xA9表示版權(quán)符號。這種方法也只能輸出256種字符急膀。
  3. \uXXXX:\u后面緊跟四個十六進制數(shù)(0000到FFFF)沮协,代表一個字符。XXXX對應該字符的 Unicode 碼點卓嫂,比如\u00A9表示版權(quán)符號慷暂。

字符串與數(shù)組

  • 字符串可以被視為字符數(shù)組,因此可以使用數(shù)組的方括號運算符晨雳,用來返回某個位置的字符(位置編號從0開始)行瑞。
    var s = 'hello';
    s[0] // "h"
    s[4] // "o"
    
    // 直接對字符串使用方括號運算符
    'hello'[1] // "e"
    
  • 如果方括號中的數(shù)字超過字符串的長度奸腺,或者方括號中根本不是數(shù)字,則返回undefined蘑辑。
  • 字符串內(nèi)部的單個字符無法改變和增刪洋机,這些操作會默默地失敗。
  • 字符集
    • JavaScript 不僅以 Unicode 儲存字符洋魂,還允許直接在程序中使用 Unicode 碼點表示字符。
      var f\u006F\u006F = 'abc';
      foo // "abc"
      
    • 每個字符在 JavaScript 內(nèi)部都是以16位(即2個字節(jié))的 UTF-16 格式儲存喜鼓。也就是說副砍,JavaScript 的單位字符長度固定為16位長度,即2個字節(jié)庄岖。但是豁翎,UTF-16 有兩種長度:對于碼點在U+0000到U+FFFF之間的字符,長度為16位(即2個字節(jié))隅忿;對于碼點在U+10000到U+10FFFF之間的字符心剥,長度為32位(即4個字節(jié)),而且前兩個字節(jié)在0xD800到0xDBFF之間背桐,后兩個字節(jié)在0xDC00到0xDFFF之間优烧。舉例來說,碼點U+1D306對應的字符為??链峭,它寫成 UTF-16 就是0xD834 0xDF06畦娄。

Base64 轉(zhuǎn)碼

  • 有時,文本里面包含一些不可打印的符號弊仪,比如 ASCII 碼0到31的符號都無法打印出來熙卡,這時可以使用 Base64 編碼,將它們轉(zhuǎn)成可以打印的字符励饵。另一個場景是,有時需要以文本格式傳遞二進制數(shù)據(jù)役听,那么也可以使用 Base64 編碼颓鲜。
  • 所謂 Base64 就是一種編碼方法,可以將任意值轉(zhuǎn)成 0~9禾嫉、A~Z灾杰、a-z、+和/這64個字符組成的可打印字符熙参。
  • btoa():任意值轉(zhuǎn)為 Base64 編碼
  • atob():Base64 編碼轉(zhuǎn)為原來的值
  • 要將非 ASCII 碼字符轉(zhuǎn)為 Base64 編碼艳吠,必須中間插入一個轉(zhuǎn)碼環(huán)節(jié),再使用這兩個方法孽椰。
    function b64Encode(str) {
      return btoa(encodeURIComponent(str));
    }
    
    function b64Decode(str) {
      return decodeURIComponent(atob(str));
    }
    
    b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"
    b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"
    

任意類型轉(zhuǎn)字符串

  1. String()

    String(1)   //"1"
    String(true)    //"true"
    String(null)    //"null"
    String(undefined)   //"undefined"
    String({})    //"[object Object]"
    
  2. toString()

    (1).toString()    //"1"
    true.toString()   //"true"
    null.toString()   //報錯
    undefined.toString()    //報錯
    {}.toString()   //報錯
    ({}).toString()   //"[object Object]"
    
  3. x + ''

    1 + ''    //"1"
    true + ''   //"true"
    null + ''   //"null"
    undefined + ''    //"undefined "
    {} + ''   //0
    var o = {}; o + '';   //"[object Object]"
    

7. Object 類型

  • 如果鍵名是數(shù)值昭娩,會被自動轉(zhuǎn)為字符串凛篙。
    var obj = {
    1: 'a',
    3.2: 'b',
    1e2: true,
    1e-2: true,
    .234: true,
    0xFF: true
    };
    
    obj
    // Object {
    //   1: "a",
    //   3.2: "b",
    //   100: true,
    //   0.01: true,
    //   0.234: true,
    //   255: true
    // }
    
    obj['100'] // true
    
  • 如果鍵名不符合標識名的條件(比如第一個字符為數(shù)字,或者含有空格或運算符)栏渺,且也不是數(shù)字呛梆,則必須加上引號,否則會報錯磕诊。
  • { foo: 123 }這是表達式還是語句填物?:JavaScript 引擎的做法是,如果遇到這種情況霎终,無法確定是對象還是代碼塊滞磺,一律解釋為代碼塊。如果要解釋為對象莱褒,最好在大括號前加上圓括號击困。因為圓括號的里面,只能是表達式广凸,所以確保大括號只能解釋為對象阅茶。
    ({ foo: 123 }) // 正確
    ({ console.log(123) }) // 報錯
    
  • Object.keys(object):查看一個對象本身的所有屬性。
  • delete:用于刪除對象的屬性谅海,刪除成功后返回true脸哀。刪除一個不存在的屬性,delete不報錯胁赢,而且返回true企蹭。無法刪除繼承的屬性。
  • in:用于檢查對象是否包含某個屬性智末,但它不能識別哪些屬性是對象自身的谅摄,哪些屬性是繼承的。
  • hasOwnProperty("name"): 用于檢查屬性是否在對象中系馆,不包括繼承屬性送漠。
  • isPrototypeOf(object): 用于檢查給定對象是否為當前對象的原型。
  • propertyIsEnumerable("name"): 用于檢查屬性是否能用 for-in 枚舉由蘑。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闽寡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子尼酿,更是在濱河造成了極大的恐慌爷狈,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裳擎,死亡現(xiàn)場離奇詭異涎永,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門羡微,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谷饿,“玉大人,你說我怎么就攤上這事妈倔〔┩叮” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵盯蝴,是天一觀的道長毅哗。 經(jīng)常有香客問我,道長捧挺,這世上最難降的妖魔是什么黎做? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮松忍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筷厘。我一直安慰自己鸣峭,他們只是感情好,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布酥艳。 她就那樣靜靜地躺著摊溶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪充石。 梳的紋絲不亂的頭發(fā)上莫换,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音骤铃,去河邊找鬼拉岁。 笑死,一個胖子當著我的面吹牛惰爬,可吹牛的內(nèi)容都是我干的喊暖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼撕瞧,長吁一口氣:“原來是場噩夢啊……” “哼陵叽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起丛版,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤巩掺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后页畦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胖替,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了刊殉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殉摔。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖记焊,靈堂內(nèi)的尸體忽然破棺而出逸月,到底是詐尸還是另有隱情,我是刑警寧澤遍膜,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布碗硬,位于F島的核電站,受9級特大地震影響瓢颅,放射性物質(zhì)發(fā)生泄漏恩尾。R本人自食惡果不足惜虏缸,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一陶夜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧麸锉,春花似錦信柿、人聲如沸冀偶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽进鸠。三九已至,卻和暖如春形病,著一層夾襖步出監(jiān)牢的瞬間客年,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工漠吻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留量瓜,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓侥猩,卻偏偏與公主長得像榔至,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子欺劳,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • JavaScript定義了幾種數(shù)據(jù)類型唧取?哪些是原始類型?原始類型和復雜類型的區(qū)別是什么划提?ECMAScript中有5...
    赫魯曉夫的玉米棒子閱讀 1,500評論 0 1
  • 1鹏往、標識符 標識符是指變量淡诗、函數(shù)、屬性的名字,或函數(shù)的參數(shù)韩容。 格式規(guī)則: 第一個字符必須是一個字母款违、下劃線(_)或...
    霜天曉閱讀 693評論 0 0
  • 1插爹、標識符 標識符是指變量、函數(shù)请梢、屬性的名字赠尾,或函數(shù)的參數(shù)。 格式規(guī)則: 第一個字符必須是一個字母毅弧、下劃線(_)或...
    風中丶凌亂閱讀 1,622評論 0 0
  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,106評論 0 21
  • 從2018年年末气嫁,一直到最近,一直被xcode10.1煩擾够坐。xcode的更新寸宵,隨之而來的便是老項目中各種莫名其妙的...
    龍煉川閱讀 857評論 0 2