JavaScript - 談談資料型別

更新於 發佈於 閱讀時間約 8 分鐘

JavaScript 的型別可以分為兩類,分別是原始型別與物件型別,這邊主要談的是 ES6 的寫法。值得注意的是,JavaScript 變數本身不帶有型別,值才有。

raw-image

原始型別

原始型別(Primitive type)有以下七種:

  • String
  • Number
  • Boolean
  • Null
  • Undefined
  • Symbol:ES6/2015 之後出現
  • BigInt:ES11/2020 之後出現,適用於當數值非常非常大,單純使用 Number 難以負荷時就會使用該型別。

下面就來談談各個型別的特色,但目前 Symbol 和 BigInt 我還沒有使用過,這篇就先不提這兩種,留待以後補充。

字串 String

須使用雙引號 "" 或單引號 '' 包裹起來,且不能混合使用。

console.log("It's a dog."); //"It'is a dog."
console.log('It's a dog.'); //error //英文句子中重複出現單引號,導致 JS 認為語法錯誤
console.log("It is a dog.'); //error //混合使用單引號和雙引號,導致 JS 認為語法錯誤

,如果沒有使用單引號和雙引號,JS 會認為這是變數,認為前面沒有宣告過該變數,就會報錯。

console.log("奶油義大利麵"); //"奶油義大利麵"
console.log(奶油義大利麵); //error //JS認為是在呼叫變數,會報錯

數字 Number

NaN(not an number) 也是屬於 Number,會出現在 JS 自動轉型後的結果無法轉換為數字。

布林 Boolean

只有 true 和 false 兩種值,它不是字串,並不需要用引號包裹,經常用於流程判斷。

Undefind 與 Null 的差異

兩個都表示空值的意思,但使用時機並不相同,像是 Undefined 會出現在已宣告、尚未賦值的變數上,通常並不會手動賦予到變數上。

let mother;
console.log(typeof mother); //Undefined

而 Null 則是會手動賦予給變數,目前所知的使用情境像是:當變數儲存大量資料,需要清空釋放記憶體時,就會手動賦予 Null 到變數上。

物件型別

原始型別以外的都是物件型別(Object Type),包括 Function、Array 都是屬於物件型別,所以並沒有 Function 型別,或是 Array 型別這種東西,包括以下幾個種類:

  • 物件 Object
  • 陣列 Array
  • 函式 Function

物件 Object

使用 { } 包裹的資料,並包含一對 key 和 value,可以儲存多組

let family = {
  father: "Mark", //father 是 key,"mark" 是 value
  mother: "Alice",
  dog: "Momo"
}

陣列 Array

使用 [ ] 包裹的資料,可以儲存多個資料

let drinks = ["可口可樂", "可爾必思", "珍珠奶茶"]

陣列和物件也可以混合使用

let store = {
  boss: "Tina",
  drinks: ["卡布奇諾", "黑咖啡", "珍珠奶茶"],
  customer: 20
}

let stores = [
  {
    storeName: "朵朵咖啡廳",
    boss: "Tina",
    drinks: ["卡布奇諾", "黑咖啡", "珍珠奶茶"],
    customer: 20  
  },
  {
    storeName: "桑心酒吧",
    boss: "Gray",
    drinks: ["啤酒", "長島青茶", "威士忌"],
    customer: 20
  },
]

查詢型別

使用 typeof 方法

這邊先使用在原始型別的查詢上:

console.log(typeof "Alice"); //String
console.log(typeof 123); //Number
console.log(typeof true); //Boolean
console.log(typeof undefined); //Undefined
console.log(typeof null); //Object // why?

會發現 null 的結果居然是物件!

這是一個著名的 JS 錯誤,原本有被提出來要修正,但因為會影響到許多網站的正常運作,所以就將錯就錯、沒有修正了,這答案是不是很出乎意料XD

再來是物件型別的查詢:

console.log(typeof []); //Object
console.log(typeof {}); //Object
console.log(typeof function(){}); //function //why?

這邊會發現兩個問題:

  1. [ ] 和 { } 出來的結果都是 Object,要怎麼判斷它是陣列還是物件呢?
  2. 為什麼會出現 Function 型別?不屬於原始型別的,應該都會是物件型別?

所以可以發現, typeof 查詢型別的結果有時候沒那麼精準,需要搭配其他方式來查詢型別。

使用其他方法查詢型別

方法一:Array.isArray()

以此方法來判斷型別是否為陣列,是陣列的話會回傳 true,不是就回傳 false。就可以解決使用 typeof 無法看出該值是陣列或物件的問題。

console.log(Array.isArray([])); //true
console.log(Array.isArray({})); //false

方法二:Object.prototype.toString.call()

這方法只需要看最後結果就能夠正確知道型別囉!

console.log(Object.prototype.toString.call("Mina")); //[object String]
console.log(Object.prototype.toString.call(123)); //[object Number]
console.log(Object.prototype.toString.call(undefined)); //[object Undefined]
console.log(Object.prototype.toString.call(null)); //[object Null]
console.log(Object.prototype.toString.call([])); //[object Array]
console.log(Object.prototype.toString.call({})); //[object Object]
console.log(Object.prototype.toString.call(function(){})); //[object Function]

有關 JavaScript 型別的分享就到這裡,若有錯誤歡迎指正,感謝看完這篇的大家。

留言
avatar-img
留言分享你的想法!
avatar-img
傑米的沙龍
7會員
30內容數
正在一點一滴學習程式,相信知識量總有一天會匯聚成大海,目前專門研究前端中。
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
本章節旨在介紹 TypeScript 的基本資料型別,包括內建型別、型別轉換、自訂型別、元組、集合、陣列、和字典型別。透過理解和使用這些型別,可以提高代碼的可讀性和可維護性。
Thumbnail
本章節旨在介紹 TypeScript 的基本資料型別,包括內建型別、型別轉換、自訂型別、元組、集合、陣列、和字典型別。透過理解和使用這些型別,可以提高代碼的可讀性和可維護性。
Thumbnail
這些章節的目的是為了介紹JavaScript中的各種數據類型,包括基礎類型和物件類型,以及如何將數據從一種類型轉換為另一種類型。此外,還介紹了如何創建自定義類型,以及如何使用JavaScript中的陣列、集合和字典。
Thumbnail
這些章節的目的是為了介紹JavaScript中的各種數據類型,包括基礎類型和物件類型,以及如何將數據從一種類型轉換為另一種類型。此外,還介紹了如何創建自定義類型,以及如何使用JavaScript中的陣列、集合和字典。
Thumbnail
針對 JavaScript 中的原始型別和隱性轉型進行了詳細的探討
Thumbnail
針對 JavaScript 中的原始型別和隱性轉型進行了詳細的探討
Thumbnail
JS 資料型別分為兩大類,原始型別 (Primitive values) 和物件型別 (Objects)。
Thumbnail
JS 資料型別分為兩大類,原始型別 (Primitive values) 和物件型別 (Objects)。
Thumbnail
在先前的型別文章中,我們曾經聊過 JavaScript 常用的一些型別,但針對布林這個型別,我們沒有做太多的解釋,原因在於布林值在 JavaScript 會有一個特殊的規則:自動轉型 。 自動轉型可說是讓 JavaScript 為弱型別、且難以管理的最重要的要素,接著就來讓我們來聊聊什麼是自動轉型
Thumbnail
在先前的型別文章中,我們曾經聊過 JavaScript 常用的一些型別,但針對布林這個型別,我們沒有做太多的解釋,原因在於布林值在 JavaScript 會有一個特殊的規則:自動轉型 。 自動轉型可說是讓 JavaScript 為弱型別、且難以管理的最重要的要素,接著就來讓我們來聊聊什麼是自動轉型
Thumbnail
在剛開始寫 JavaScript 可能大多數的人不會特別意識到 JavaScript 的型別系統有什麼特別之處,我是在看完 Youtube 上 CS50 的課程,才理解到在不同的程式語言中,會因為語言的特性而有不同的系統,JavaScript 就是偏向比較特別的那一種。
Thumbnail
在剛開始寫 JavaScript 可能大多數的人不會特別意識到 JavaScript 的型別系統有什麼特別之處,我是在看完 Youtube 上 CS50 的課程,才理解到在不同的程式語言中,會因為語言的特性而有不同的系統,JavaScript 就是偏向比較特別的那一種。
Thumbnail
JavaScript 的型別可以分為兩類,分別是原始型別與物件型別,這邊主要談的是 ES6 的寫法。值得注意的是,JavaScript 變數本身不帶有型別,值才有。
Thumbnail
JavaScript 的型別可以分為兩類,分別是原始型別與物件型別,這邊主要談的是 ES6 的寫法。值得注意的是,JavaScript 變數本身不帶有型別,值才有。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News