深入 ECMAScript 的數據類型
出版:2017-05-18
每一種編程語言都有數據結構,但他們各有不同之處。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 %}
原始數據類型:
我們可以透過使用typeof
和Object.prototype.toString()
來判斷數據類型。
在 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 的:
Table 35: typeof Operator Results
val 的類型 | 結果 |
---|---|
Item One | Item Two |
Type of val | Result |
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.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():
this
value is undefined
, return "[object Undefined]"
.this
value is null
, return "[object Null]"
.O
be ! ToObject(this
value).isArray
be ? IsArray(O
).isArray
is true
, let builtinTag
be "Array"
.O
is a String exotic object, let builtinTag
be "String"
.O
has a [[ParameterMap]] internal slot, let builtinTag
be "Arguments"
.O
has a [[Call]] internal method, let builtinTag
be "Function"
.O
has an [[ErrorData]] internal slot, let builtinTag
be "Error"
.O
has a [[BooleanData]] internal slot, let builtinTag
be "Boolean"
.O
has a [[NumberData]] internal slot, let builtinTag
be "Number"
.O
has a [[DateValue]] internal slot, let builtinTag
be "Date"
.O
has a [[RegExpMatcher]] internal slot, let builtinTag
be "RegExp"
.builtinTag
be "Object"
.tag
be ? Get(O
, @@toStringTag).tag
) is not String, let tag
be builtinTag
."[object "
, tag
, and "]"
.Calpa 是一個四天工作的系統架構師,日常幫助客戶構建一站式網站應用,手機應用,雲端架構。
2023 年 9 月,Calpa 收到來自國內外不同 Web3 團隊的邀請,參加韓國的 KBW 2023 和新加坡的 TOKEN 2049 活動。十二月份,Calpa 將參加台北區塊鏈週的 Hackathon 比賽。
Calpa 擅長運用各種前沿技術,包括 TypeScript、React.js 和 Vue.js,開發具有 Responsive Web Design 的網站。另外,他透過運用 aws-cdk 和 TypeScript 技術的融合,實現了基於雲端的「基礎即代碼」(Infrastructure as Code)部署策略,建立了多套高效且具有可伸縮性的全端架構。
同時,Calpa 積極參與各個社群,活躍於香港和台灣的開源社區,分享前沿知識。他曾在 2019 年的香港開源大會中擔任重要講者,為聽眾提供寶貴的工作經驗和深刻見解。此外,Calpa 在 GitHub 上公開分享了個人博客程式碼,已獲得超過 300 顆星星和 60 個分支。
如果您對系統架構有任何問題,或需要進一步交流,請隨時聯絡 Calpa,他非常歡迎討論。