充電計劃 — JavaScript內建型別

JavaScript內建型別

  • 資料型態與資料結構
    • 動態型別
    • 資料型態
    • 原始值
    • 物件
      • 屬性
        • 資料屬性
        • 訪問器屬性
      • 「標準」物件和函式
        • 內建物件
  • typeof
    • 原理
    • 安全防範機制
  • JavaScript的型別、值、形態轉換

注意:當前部落格根據ECMAScript 6版本進行學習。

資料型態與資料結構

參考網址:JavaScript資料型態與資料結構

動態型別

JavaScript是一種弱型別/動態語言,不用提前宣告變數的型別。在程式執行過程中,型別會被自動確定。

1
2
3
var foo = 42;    // foo is a Number now
foo = "bar"; // foo is a String now
foo = true;  // foo is a Boolean now

資料型態

截止至今,ECMAScript標準定義了9種資料型態

  • 原始型別
    • undefined:typeof instance === "undefined"
    • Boolean:typeof instance === "boolean"
    • Number:typeof instance === "number"
    • String:typeof instance === "string「
    • BigInt:typeof instance === "bigint"
    • Symbol :typeof instance === 「symbol」
  • null
    • null:typeof instance === "object"
  • Object
    • object:typeof instance === "object"
      任何 constructed 物件例項的特殊非資料結構型別,也用做資料結構:new Object,new Array,new Map,new Set,new WeakMap,new WeakSet,new Date,和幾乎所有透過 new keyword 建立的東西。
  • Function
    • Function:typeof instance === "function"
      非資料結構,每個 Function 建構器都由 Object 建構器派生

原始值

除 Object 以外的所有型別都是不可變的(值本身無法被改變)。

  • 布林型別:布林表示一個邏輯實體,可以有兩個值:true 和 false。
  • Null 型別:Null 型別衹有一個值: null。
  • Undefined型別:一個沒有被賦值的變數會有預設值undefined。
  • 數值型別:根據 ECMAScript 標準,JavaScript 中衹有一種數值型別:基於 IEEE 754 標準的雙精度 64 位二進位制格式的值(-(2(53) -1) 到 2(53) -1)。它並沒有為整數給出一種特定的型別。除了能夠表示浮點數外,還有一些帶符號的值:+Infinity,-Infinity 和 NaN (非數值,Not-a-Number)。
  • BigInt型別:BigInt型別是 JavaScript 中的一個基礎的數實值型別,可以用任意精度表示整數。使用 BigInt,您可以安全地儲存和操作大整數,甚至可以超過數值的安全整數限制。BigInt是透過在整數末尾附加 n 或呼叫建構函式來建立的。
  • 字串型別:JavaScript的字串型別用於表示文字資料。它是一組16位的無符號整數值的「元素」。
  • 符號型別:符號(Symbols)是ECMAScript 第6版新定義的。符號型別是唯一的並且是不可修改的, 並且也可以用來作為Object的key的值。

注意:JavaScript的字串是不可更改的。

物件

在電腦科學中,物件值記憶體中可以被標識符引用的一塊區域

屬性

  • 在 Javascript 里,物件可以被看作是一組屬性的集合。用物件字面量語法來定義一個物件時,會自動初始化一組屬性。
  • ECMAScript定義的物件中有兩種屬性:資料屬性和訪問器屬性。

資料屬性

資料屬性是鍵值對,並且每個資料屬性擁有下列屬性:
資料屬性的特徵

訪問器屬性

訪問器屬性有一個或兩個訪問器函式 (get 和 set) 來存取數值,並且有以下屬性:
一個訪問器屬性的特徵
注意:這些屬性衹有 JavaScript 引擎才用到,因此你不能直接訪問它們。所以屬性被放在兩對方括弧中,而不是一對。

「標準」物件和函式

JavaScript物件是鍵值之間的對映。

  • 鍵:一個字串(或Symbol)
  • 值:任意型別的值
    函式時一個福袋可悲呼叫功能的常規物件

內建物件

  • 日期
  • 陣列(有序集):一種使用整數作為鍵(integer-key-ed)屬性和長度(length)屬性之間關聯的常規物件
  • 型別陣列(有序集):提供了一個基本的二進位制資料緩衝區的類陣列檢視表
    部分TypeArray型別
  • Maps/WeakMap(鍵控集):把一個值和物件關聯起來,區別在於maps的鍵是可列舉的,允許垃圾收集器調校後面的列舉。
  • Sets/WeakSets(鍵控集):表示一組物件
  • JSON(結構化資料):一種輕量級的資料交換格式
  • JavaScript標準庫…

typeof

原理

不同的物件在底層都表示為二進位制,
在 JavaScript 中二進位制前三位都為 0 的話會被判斷為 object 型別, null 的二進位製表示是全 0, 自然前三位也是 0, 所以執行 typeof 時會回傳「object」。

注意:

  • javascript 中的 null:既是物件,又不是物件
1
2
3
typeof null === 'object';
null instanceof Object === false
null instanceof null // Uncaught TypeError: Right-hand side of 'instanceof' is not an object

JavaScript的最初版本中,使用的32位系統,低位儲存的變數型別訊息:

  • 000:物件
  • 1:整數
  • 010:浮點數
  • 100:字串
  • 110:布林
  • undefined:用 - (?2^30)表示。
  • null:對應機器碼的 NULL 指標,一般是全零。

安全防範機制

1
2
3
var a; // a為undefined,b為undeclared
typeof a; // 'underfined'
typeof b; // 'underfined'

JavaScript的型別、值、形態轉換

JavaScript型別