JS裡的資料型別

zachcoco發表於2019-03-20

1. 概述

JavaScript一共有7種資料型別:

  • 數值(number):整數和小數
  • 字串(string):文字(比如Hello World)。
  • 布林值(boolean):表示真偽的兩個特殊值,即true(真)和false(假)
  • undefined:表示“未定義”或不存在,即由於目前沒有定義,所以此處暫時沒有任何值
  • null:表示空值,即此處的值為空。
  • 物件(object):各種值組成的集合。
  • 符號(symbol):ES6新增。暫不討論。

一般將number,string,boolean視為原始型別(primitive type)的值,物件則稱為合成型別(complex type)的值,undefined和null為JS特有的特殊的值。

物件又可以分為三個子型別:

  • 狹義的物件(object)
  • 陣列(array)
  • 函式(function)

需要注意的是array和function並不是七種型別之一。

2. 數值

  1. 所有數字都是以64位浮點數形式儲存(很浪費)
  2. 小數運算不精確
0.1 + 0.2
0.30000000000000004
複製程式碼
  1. JavaScript的精度範圍為-253到253 ,能夠表示的數值範圍為21024到2-1023
  2. 數值的進位制:開頭有0要小心
    1. 十進位制:沒有前導0的數值。
    2. 八進位制:有字首0o0O的數值,或者有前導0、且只用到0-7的八個阿拉伯數字的數值。
    3. 十六進位制:有字首0x0X的數值。
    4. 二進位制:有字首0b0B的數值。
0xff // 255
0o377 // 255
0b11 // 3
複製程式碼
  1. 特殊數字
    1. NaN:Not a Number
    2. +Infinity-Infinity

3. 字串

  1. JavaScript 不僅以 Unicode 儲存字元,還允許直接在程式中使用 Unicode 碼點表示字元,即將字元寫成\uxxxx。但 JavaScript 對 UTF-16 的支援是不完整的,只編到U+FFFF
  2. 空字串:''
  3. 多行字串
var a = '123' +
'456';
複製程式碼
var a = `123
456`;
複製程式碼
  1. 轉義符
\n :換行符(\u000A)
\r :Enter鍵(\u000D)
\' :單引號(\u0027)
\" :雙引號(\u0022)
\\ :反斜槓(\u005C)
\0 :null(\u0000)
\b :後退鍵(\u0008)
\f :換頁符(\u000C)
\t :製表符(\u0009)
\v :垂直製表符(\u000B)
複製程式碼
  1. Base64 轉碼
    • btoa():任意值轉為 Base64 編碼
    • atob():Base64 編碼轉為原來的值
    • 要將非 ASCII 碼字元轉為 Base64 編碼,必須中間插入一個轉碼環節,再使用這兩個方法

4. 布林值

  1. 布林值代表“真”和“假”兩個狀態。“真”用關鍵字true表示,“假”用關鍵字false表示。布林值只有這兩個值。
  2. 運算子號
前置邏輯運算子:! (Not)
相等運算子:===,!==,==,!=
比較運算子:>,>=,<,<=
複製程式碼
  1. 以下6個值轉化為Boolean時為false,稱為falsy(虛值)。undefined null false 0 NaN ""或''(空字串)

5. null 和 undefined

  1. 都表示沒有值,null表示空值,即該處的值現在為空。undefined表示“未定義”。
undefined == null    // true
複製程式碼
  1. (習俗)如果你想表示一個還沒賦值的物件,就用null。如果你想表示一個還沒賦值的字串/數字/布林/symbol,就用 undefined(但是實際上你直接var xxx一下就行了,不用寫var xxx = undefined

6. 物件

  1. 物件就是一組“鍵值對”(key-value)的集合,是就是幾種基本資料型別(無序地)組合在一起。
  2. 因此物件裡面也可以有物件
  3. key必須為字串,不符合識別符號條件必須加引號(更多人不喜歡加)。
  4. 屬性讀取:有兩種方法,一種是使用點運算子,還有一種是使用方括號運算子
    1. 符合識別符號規則時,object['key']可以寫作object.key
    2. 如果使用方括號運算子,鍵名必須放在引號裡面,否則會被當作變數處理。注意object['key']object[key]區別
  5. 屬性刪除:delete object['key']
    1. 查詢該屬性值為undefined,此時key也刪掉了,用in查為false
    2. 如果給key賦值undefined,用in查為true
  6. 屬性檢視:Object.keys
  7. 屬性是否存在:用in運算子,自身和繼承的都能看到。
var obj = { p: 1 };
'p' in obj  // true
'toString' in obj   // true
複製程式碼
  1. 屬性遍歷:for...in
    1. 它遍歷的是物件所有可遍歷(enumerable)的屬性,會跳過不可遍歷的屬性。
    2. 它不僅遍歷物件自身的屬性,還遍歷繼承的屬性。

7. typeof 運算子

typeof可以用來判斷資料型別,但是存在兩個bug:

  • typeof null //'object'
  • 並沒有function資料型別,但會顯示
function f() {}
typeof      // "function"
複製程式碼

8. Symbol

詳見:JS 中的 Symbol 是什麼?

9. 參考資料

JavaScript教程——阮一峰

相關文章