結論

這裡統整一下目前的內容:

Note

  • JavaScript 的基本語法
  • JavaScript 中的型別系統
  • 早期的物件與現代化的語法
  • JavaScript 內部引擎的運作機制
  • 非同步程式:Promise與 async/await
  • 常用的函式

這裡釐清一個問題, JavaScript Core 到底指的是什麼部份呢?

可以參考 MDN 的 Standard Built-in Object, 基本上就是 JavaScript 的核心, 常用的部分為:

  • Infinity、NaN、undefined 等屬性值
  • Global Function
    • isFinite()
    • isNaN()
    • parseFloat()
    • parseInt()
    • encodeURI()
    • encodeURIComponent()
    • decode()
    • decodeURIComponent()
  • Global Object
    • Number
    • BigInt
    • Math
    • Date
    • String
    • RegExp
  • Indexed Collections
    • Array
    • Typed-Array (參考 MDN, 就是限制每個元素幾個位元的陣列, 類似C的靜態型別)
  • Keyed Collections
    • Map、WeakMap
    • Set、WeakSet
  • 結構化資料
    • JSON
    • ArrayBuffer、SharedArrayBuffer
    • Atomics
    • DataView
  • 控制抽象物件
    • Promise、Generator
  • Reflection
    • Proxy
    • Reflect
  • 各種 Error 物件

最核心的部分是 Global Object 以及 ArrayJSONPromise

ArrayBuffer 如果處理檔案上傳或是 WebSocket, 也有機會使用到

WebGL 的應用也常常使用到 TypedArray

不屬於 JavaScript Core 的部份

Web API

在 Overview 有提到, JavaScript 可以運行在瀏覽器以外的環境(Node.js), 這情況下, 通常會當作伺服器運行

而由瀏覽器提供的一系列JavaScript函式或物件, 被稱作Web API, 這裡提出幾個常用的:

  • Window: 一個包含 DOM 文件的視窗, 可以說是瀏覽器物件模型(BOM), 得以透過 JavaScript 跟瀏覽器進行互動:
    • history:與瀏覽紀錄的歷史有關
    • location:當前頁面的網址資訊
    • screen:目前的視窗資訊
    • navigator:瀏覽器本身的資訊, 像是版本號、運行平台等
  • Document: 處理 DOM Tree, 包含HTML、XML、SVG 等類型;或是像 Cookie 等資料, 象徵瀏覽器中載入的網頁資訊

Web API實在是有太多部份, 例如WebSocketWebRTC(即時影音通訊)、剪貼簿、事件目標、audio/video 處理模組 ... 等

Nodejs

相對於 Web API, 伺服器端的 JavaScript (Node.js) 不需要處理瀏覽器相關的功能, 但是要求直接存取系統上的資源:

  • node:crypto:加密/解密模組
  • node:http:HTTP協定相關模組(發送請求、開啟伺服器等)
  • node:process:有關目前運行的Process(行程)資訊
  • node:os:作業系統相關的資訊
  • node:fs:檔案系統的操作介面
  • node:net:底層TCP、IPC的操作介面
  • node :dgram:底層UDP的操作介面
  • C++ Addons:與C++ Library 交互的一系列操作模組

如上所列, Nodejs專注在系統相關的操作, 以及如何與 C++ 進行溝通, 反而一些通用格式的解析器(如XML、SVG)或是影音模組並沒有提供

所以 JavaScript 其實可以分成兩部份:

  • Standard Object + Web API = 瀏覽器上的JavaScript
  • Standard Object + Nodejs API = 伺服器端上的JavaScript

而 Web API、Nodejs API 這些又被稱為宿主環境(Host Environment), 因為他們是由 Runtime Environment 提供者給予的操作介面