深入 ECMAScript 的數據類型

作者: Calpa Liu
字數:702
出版:2017 年 5 月 18 日
#JavaScript#Frontend
每一種編程語言都有數據結構,但他們各有不同之處。JavaScript 是一種動態語言,變數的類型不用提前聲明,你可以使用同一個變數來保存不同的數據類型。

每一種編程語言都有數據結構,但他們各有不同之處。JavaScript 是一種動態語言,變數的類型不用提前聲明,你可以使用同一個變數來保存不同的數據類型。

var a = 'apple'; // String type
var a = 42; // Number type
var a = true; // Boolean type

這就和 Python 的寫法差不多:

a = 'apple' // String type
a = 42 // Number type
a = True // Boolean type

數據類型

ECMAScript 標準明確定義了 7 種數據類型:6 種原始類型 (Primitive value) 和 Object。

{% img /img/javascript-data-structures.svg 300 auto JavaScript Data Structure %}

原始數據類型:

  1. Undefined
  2. Null
  3. Boolean
  4. Number
  5. String
  6. Symbol (ECMAScript 2015)

判斷方法

我們可以透過使用typeofObject.prototype.toString()來判斷數據類型。

typeof

在 JavaScript 誕生之時,數值是由一個標籤以及實際數據值表示的。基本類型的標籤是 1,而對象類型的標籤是 0。

由於 null 代表的是空指針 (全部都是 0),null 的類型標籤會是 0。如果你在 console 直接輸入typeof null的話,就會得到 “object” 的結果,雖然這不是我們想要的值。。。

typeof undefined; // "undefined"
typeof Boolean;   // "function"
typeof true;      // "boolean"
typeof 42;        // "number"
typeof "42";      // "string"
typeof Symbol();  // "symbol"

我們可以看一下 ECMAScript 是怎樣定義 typeof 的:

  1. Let val be the result of evaluating UnaryExpression.
  2. If Type(val) is Reference, then a. If IsUnresolvableReference(val) is true, return “undefined”.
  3. Set val to ? GetValue(val).
  4. Return a String according to Table 35.

Table 35: typeof Operator Results

val 的類型結果
Item OneItem Two
Type of valResult
Undefined”undefined”
Null”object”
Boolean”boolean”
Number”number”
String”string”
Symbol”symbol”
Object (ordinary and does not implement [[Call]])“object”
Object (standard exotic and does not implement [[Call]])“object”
Object (implements [[Call]])“function”
Object (non-standard exotic and does not implement [[Call]])Implementation-defined. Must not be “undefined”, “boolean”, “function”, “number”, “symbol”, or “string”.

另外,如果直接用typeof來判斷 NaN 的話,它會返回"number",對於 NaN 我們可以用isNaN方法來判斷是否一個數字。

typeof NaN; // "number"
isNaN(NaN); // true

Object.prototype.toString()

我們可以利用Object.prototype.toString.call()或者Object.prototype.toString.apply()這兩個方法判斷 Object 的類型,以及 null:

Object.prototype.toString.call(undefined);   // "[object Undefined]"
Object.prototype.toString.call(new Date);    // "[object Date]"
Object.prototype.toString.call(new String);  // "[object String]"
Object.prototype.toString.call(Math);        // "[object Math]"
Object.prototype.toString.call(null);        // "[object Null]"

ECMAScript 19.1.3.6 明確定義 Object.prototype.toString():

  1. If the this value is undefined, return "[object Undefined]".
  2. If the this value is null, return "[object Null]".
  3. Let O be ! ToObject(this value).
  4. Let isArray be ? IsArray(O).
  5. If isArray is true, let builtinTag be "Array".
  6. Else if O is a String exotic object, let builtinTag be "String".
  7. Else if O has a [[ParameterMap]] internal slot, let builtinTag be "Arguments".
  8. Else if O has a [[Call]] internal method, let builtinTag be "Function".
  9. Else if O has an [[ErrorData]] internal slot, let builtinTag be "Error".
  10. Else if O has a [[BooleanData]] internal slot, let builtinTag be "Boolean".
  11. Else if O has a [[NumberData]] internal slot, let builtinTag be "Number".
  12. Else if O has a [[DateValue]] internal slot, let builtinTag be "Date".
  13. Else if O has a [[RegExpMatcher]] internal slot, let builtinTag be "RegExp".
  14. Else, let builtinTag be "Object".
  15. Let tag be ? Get(O, @@toStringTag).
  16. If Type(tag) is not String, let tag be builtinTag.
  17. Return the String that is the result of concatenating "[object ", tag, and "]".

參考資料

  1. ECMAScript® 2018 Language Specification
關於 Calpa

Calpa 擅長使用 TypeScriptReact.jsVue.js 建立 Responsive Website。

他積極參與開源社區,曾在 2019 年的香港開源大會上擔任講者,提供工作經驗和見解。此外,他也在 GitHub 上公開分享個人博客程式碼,已獲得超過 300 顆星星和 60 個分支的支持。

他熱愛學習新技術,並樂意分享經驗。他相信,唯有不斷學習才能跟上快速演變的技術環境。

熱門文章

最新文章

圖片管理中心
管理圖片資源
IP 查詢
快速查詢和定位 IP 地址的地理位置和相關信息
Python 運行器
無需後端、無需登入,只需打開瀏覽器即可運行 Python 代碼(由 Pyodide 提供支持)
封面圖生成器
自動創建適合各種平台的文章封面圖
原作(青山剛昌)產生器
一鍵創建原作(青山剛昌)的封面圖
日本色彩
探索和使用傳統日本色彩
部落格內容洞察儀表板
以視覺化儀表板方式追蹤文章成效、分享熱度與分類分布,協助創作者掌握內容表現。
蒙特卡羅估算 π
使用蒙特卡羅方法演示 π 值的估算過程
LLM
使用 LLM 模型進行聊天
活動圖生成器
一鍵創建活動的封面圖
Wagmi Card
一鍵創建 Wagmi 的封面圖
Facebook Quote
Facebook Quote
Music Macro Language (MML) Studio
用程式語法編寫旋律,用音符構築想像
Blurhash
一鍵創建 Blurhash
文字分類器
使用 MediaPipe TextClassifier 分類文字
前端工程師免費工具資源
前端工程師免費工具資源
後端工程師免費工具資源
後端工程師免費工具資源
全端工程師免費工具資源
全端工程師免費工具資源
Web3 工程師免費工具資源
Web3 工程師免費工具資源
紫微斗數排盤系統|結合 AI 的命盤性格與事業財務分析生成器
紫微斗數排盤工具,輸入生日與時辰,自動生成完整命盤分析提示(Prompt)。結合最專業紫微理論與 AI 助力,助你深入解析性格、事業、財務與人際課題。免費使用,適合命理師及紫微愛好者。
PixAI Prompt 組合器|快速打造可用於 AI 繪圖的語言拼圖
使用 PixAI 卻不會寫 prompt?這個工具幫你一鍵組裝角色、表情、風格語彙,輸出高品質繪圖提示語句(Prompt),可直接貼入 PixAI 使用。適合插畫師、創作者、AI 新手與 VTuber 角色開發者。