keywords:type
,built-in types
,primitive
型別
型別是一組固有的、內建的特徵,依照這點識別了特定值的行為,讓它與其他值有所分別,對於引擎及開發人員皆是如此。
- 當我們使用 42 時是想要做一些數值處理,像是算術運算
- 當我們使用 '42' 時是想要做一些字串操作,像是輸出到頁面上
之前寫 C# 的時候,如果宣告的型別錯誤程式就整個掛掉,像是把 String 做數學計算,我想這就是 JavaScript 型別的爭議吧,對於強型別的語言來說,JavaScript 的型別會強制轉型根本就是地獄。
不過換個角度想,就是因為強制轉型的強大及實用性,讓 JavaScript 得到很大的彈性,前端的世界才會因此以此語言為主,進而使這麼多非本科系的人可以簡單上手,因為它很 flexible,就跟現代流行的斜槓一樣,非本科系跑去做別的科系的工作,有好有壞,它讓擁有市場眼光的專案經理也能撰寫較符合使用者體驗的程式。
內建型別 ( Built-In Types)
根據 2021 版草稿的 ECMAScript Data Types and Values JavaScript 定義了 7 個內建型別:
- Undefined
- Null
- Boolean
- String
- Symbol
- Numeric ( Number and BigInt )
- Object
- 基本型別值 ( Primitives ) 又稱基型值共有 7 個:
string, number, bigint, boolean, undefined, null, and symbol. - 非基型值共有 1 個:
object - 其中比較特別是 null 的型別是長久以來的 bug,應回傳 null 但卻是 object
typeof null // object
- null、undefined 是唯兩個 falsy 的基型值
Boolean(null) // false Boolean(undefined) // false
根據 2021 版草稿的 ECMAScript 12.5.5 The typeof Operator - Table:35: 一個擁有 [[Call]] 內部特性且可被調用的物件,回傳 function
- object 有兩個子型別:array、function:
- array 與 object 不同是具有:
- 能以數值化的方式來索引 ( object 只能以字串作為 key )
- 自動維護並更新 .length 特性
typeof array // object
- function 此物件具有一個 length 特性,可以計算參數之數目
function a(b,c,d){...} a.length // 3 typeof a // function
- array 與 object 不同是具有:
整理一下 JavaScript 定義的型別與 Typeof 回傳的型別:
JavaScript:
- string
- number
- boolean
- null
- undefined
- object
- Symbol ( ES6 新引進的 )
Typeof:
- string
- number
- boolean
- undefined
- object
- function
- Symbol ( ES6 新引進的 )
- bigint