JavaScript淺嚐紀錄No.3-JS變數值為基本型別與影響

更新 發佈閱讀 12 分鐘

ECMAScript標準定義的七種資料型別

基本型別 (primitive type)

  1. String-字串”hello”。
  2. Number-數字 (在 -(253 -1) and 253 -1 之間的數字), +Infinity、-Infinity、NaN也是數字型別。 
  3. Boolean-布林值true / false。
  4. Undefined-已宣告,但未賦值的變數。
  5. Null-空值。
  6. Symbol()-ES6新創的,還不熟。

物件(object)

基本資料型態以外的都是物件型別。

  • object-ket-value組合{name:’Celeste’,age:18,…}。
    • Array-陣列[1,2,3,…],使用typeof foo() {}時,會顯示’object’。
    • Function-使用typeof foo()時,會顯示”function”。

參考資料:

Fooish - JavaScript ES6 Symbol 資料型態

MDN-JavaScript 的資料型別與資料結構

變數儲存By value?By reference?

先簡單解釋一下什麼是by value跟by reference的差異:

  • By value
    傳遞的值的方法是透過複製「值」,在傳遞基本型別值時都是透過「by value」。簡單的測試一下:
let a = 1

let b = a

console.log(a) //1

console.log(b) //1

console.log(a === b) //true



a = 2 // a重新賦值

console.log(a) //2

console.log(b) //1

console.log(a === b) //false
  • 變數a重新賦值後並不會更改到變數b的值,這是因為變數a值跟變數b值儲存位置不同,變數b僅僅只是複製了變數a的值(By value)。
vocus|新世代的創作平台
  • By reference
    物件通常是透過「By reference」傳遞儲存位址。先來看看下面例子:
let obj = {

a: 1

}

let main = obj

main.a = 2

main.b = 3

console.log(obj) //{a:2,b:3}

console.log(main) //{a:2,b:3}

console.log(obj === main) // true

變數main修改了值卻影響了變數obj,這都是因為變數obj跟變數main都是指向同一個儲存位址(有點像是我們的地址),地址不會變,但是地址裡面的東西可以被更改(請注意是更改,像是這個地址裡的戶口會有變更,但不會影響這個地址的位置)。


將變數obj代入function的參數,也是透過「By reference」,將變數obj的儲存位址複製給這個參數,所以調用function的話,也會變更原本的物件值。

let obj = {

a: 1

}

function change(main) {

main.a = 2

main.b = 3

}

change(obj)

console.log(obj) //{a: 2, b: 3}

需要特別注意,當物件被重新賦值的話,這個物件會被儲存到新的位址(有點像是搬家了,但原本的地址還是存在)。

let address = {

dad: 'Paul'

}

let main = address

main.dad = 'Mark'

main.mom = 'Mary'

console.log(address) //{dad: "Mark", mom: "Mary"}

console.log(main) //{dad: "Mark", mom: "Mary"}

console.log(address === main) //true



//address重新賦值

address= {

dad: 'Mark',

mom: 'Mary'

}

console.log(address) //{dad: "Mark", mom: "Mary"}

console.log(main) //{dad: "Mark", mom: "Mary"}

console.log(address === main) //false
    • 注意到最後一行console.log(address=== main)顯示的是false,但上面的console.log(address=== main)卻是true,這是因為上面的變數main只是將儲存位址裡的值做了修改(有點像是地址裡的戶口中人的名字作改變並且增加人口),但是將變數address重新賦值就代表有了新的儲存位址(類似搬家了,並且新家裡也是有同樣名字的dad跟mom),但變數main還是指向原本的的位址,所以變數address的儲存位址不等於變數main的。
      在重新賦值的情況下內容當然是可以改變,只是為了說明2個變數雖然內容相同但是物件是透過「By reference」儲存的,即使內容相同但是儲存位置不同,那麼2者比較就會是false
      如果不想要重新賦值原本設定好的物件,請一定要用const宣告喔!
vocus|新世代的創作平台

參考資料:

Programming with Mosh-Value Types and Reference Types in JavaScript

PJCHENder-[筆記] 談談 JavaScript 中 by reference 和 by value 的重要觀念

型別強制轉換(Type coercion)

MDN對JavaScript的型別解釋:JavaScript 是弱型別,也能說是動態的程式語言。這代表你不必特別宣告變數的型別。程式在運作時,型別會自動轉換。這也代表你可以以不同的型別使用同一個變數。

來分開解釋上面的意思:

  1. 因為JavaScript 的型別針對的是變數值,而非是變數,所以不必特別宣告變數的型別。
  2. 因為JavaScript 是一個對型別轉換非常寬鬆的語言,JavaScript 引擎很少會直接顯示錯誤,它會盡可能接受你寫給它的程序,甚至自己猜測你的意思(要數字、字串或布林值等等),幫你做型別自動轉換(像是把數字變字串、把false變成數字0)。

Falsy家族

falsy 值 (虚值) 是在 Boolean 上下文中认定为 false 的值。在型別轉換時,被視為0。

  • false。
  • 0。
  • “”、’’、`` -空字串。
  • null。
  • undefined。
  • NaN。

Falsy家族跟型別轉換有甚麼關係呢?看看下面的程式碼:

//JS的型別是針對變數值,所以是值的型別再更換

let foo = 42; // foo 目前是數字

foo = 'bar'; // foo 變成字串

foo = true; // foo 變成布林值

//型別轉換

console.log(10 * null) // 0, null 被當成零

console.log('5' - 1) // 4, '5' 轉換成數字

console.log('5' + 10) // '510', 10 被轉換成字串

console.log('five' * 2) // NaN, NaN 代表「不是數字」

console.log(false + 1) // 1, false 轉換成 0

使用「===」或「!==」來避免型別轉換發生的問題

兩種等號

==(相等)

型別會自動轉換,所以相互比較的值,只要內容相同,就會呈現true。

//==

//例1let A = 1 //數字

let B = false //布林值

let result = (A + B) == "1" //布林值型別轉換後true=1,false=0,所以會變成 1 + 0 == 1

console.log(typeof(A+B)) //"number"

console.log(result) //true 1 == "1"會是true



//例2let A = 1 //數字

let B = "2"//字串

let result = (A + B) == 12 //數字1會變成字串,"1" + "2" ==12

console.log(typeof(A+B)) //"string"

console.log(result) //true "12"==12 內容相同,型別不同沒關係

=== (嚴格相等)

型別無法自動轉換,也因此相互比較的值,除了內容相同外,型別也必須一樣,才會呈現true。

//===

//truelet A = 1 //數字

let B = 2 //數字

let result = (A + B) === 3 //1 + 2 === 3

console.log(typeof(A+B)) //"number"

console.log(result) //true



//false

let A = 1 //數字

let B = "2" //字串

let result = (A + B) === 12 //"1" + "2" === 12

console.log(typeof(A+B)) //"string"

console.log(result) // false "12"===12 型別不同,就會是false

兩種不等號

!= (不相等)

相互比較的值,內容相同,但型別不同,就會呈現true。

//!=

let A = 1 //數字

let B = "1" //字串

let result = A != B //1 !="1"

console.log(result) //false 內容相同,不論型別怎麼樣,就會認定2個值是一樣的。

!== (嚴格不相等)

相互比較的值,內容相同,但型別不同,就會呈現true。

// !==

//true

let A = 1 //數字

let B = "1" //字串

let result = A !== B // 1 !== "1"

console.log(result) //true 內容相同,但型別不同,會呈現true。

JavaScript 的 == 和 != 會「先將兩個值轉換成相同的資料型別」,請記得永遠使用 === 和 !==。參考MDN-JavaScript 的資料型別與資料結構、Falsy。 

參考資料:

MDN-JavaScript 的資料型別與資料結構

Falsy

留言
avatar-img
鍋灶的熱湯
1會員
13內容數
分享生活、旅行經驗,經驗是種解決問題的方式,方式不只一種歡迎大家一起分享經驗
鍋灶的熱湯的其他內容
2026/03/03
宣告變數、賦值 (assign) 變數的作用 為什麼要使用變數,原因其實很簡單,就是為了不要重複打同樣的一大串程式碼,更簡單的說就是懶,所以創造變數讓它去記得想讓它去記得的東西(同樣的一大串程式碼)。 變數的命名是有規則的 需要注意的事項 變數的名稱被稱為 identifiers 需要遵從
2026/03/03
宣告變數、賦值 (assign) 變數的作用 為什麼要使用變數,原因其實很簡單,就是為了不要重複打同樣的一大串程式碼,更簡單的說就是懶,所以創造變數讓它去記得想讓它去記得的東西(同樣的一大串程式碼)。 變數的命名是有規則的 需要注意的事項 變數的名稱被稱為 identifiers 需要遵從
2026/02/27
JavaScript跟前端的關係? MDN中的介紹: JavaScript是一種准許你在網頁上實現複雜事物的程式語言 — 每次網頁要做的不只是停在那裏,並顯示靜態信息給你— 及時顯示內容更新、交互式地圖、繪製2D/3D 動畫圖形以及滾動視訊點唱機等等。— 你會發現 JavaScript 幾乎無處
2026/02/27
JavaScript跟前端的關係? MDN中的介紹: JavaScript是一種准許你在網頁上實現複雜事物的程式語言 — 每次網頁要做的不只是停在那裏,並顯示靜態信息給你— 及時顯示內容更新、交互式地圖、繪製2D/3D 動畫圖形以及滾動視訊點唱機等等。— 你會發現 JavaScript 幾乎無處
2026/02/27
在了解 Callback Functions Hell ,必須先知道甚麼是 Callback Functions ,而 Callback Functions 怎麼造成 Callback Functions Hell。 Callback Functions 其實有寫過 JS 的 都應該有用過 Ca
2026/02/27
在了解 Callback Functions Hell ,必須先知道甚麼是 Callback Functions ,而 Callback Functions 怎麼造成 Callback Functions Hell。 Callback Functions 其實有寫過 JS 的 都應該有用過 Ca
看更多
你可能也想看
Thumbnail
在現代 Web 開發中,框架的規範性對於團隊合作至關重要。這不僅提高了程式碼的一致性,也降低了理解他人程式碼的時間成本。現在,我們將以 JavaScript 為例,展示如何使用關注點分離的原則來撰寫一個簡單的應用喔。
Thumbnail
在現代 Web 開發中,框架的規範性對於團隊合作至關重要。這不僅提高了程式碼的一致性,也降低了理解他人程式碼的時間成本。現在,我們將以 JavaScript 為例,展示如何使用關注點分離的原則來撰寫一個簡單的應用喔。
Thumbnail
學習程式設計不再困難!本文提供一份循序漸進的 JavaScript 教學,每天只需 10 分鐘,就能從基礎語法到專案實作,逐步學習網頁開發,包含 HTML、CSS、JavaScript、DOM 操作、Canvas 等,並以 Road Map 呈現學習進度。即使零基礎也能輕鬆入門,開啟程式設計之路。
Thumbnail
學習程式設計不再困難!本文提供一份循序漸進的 JavaScript 教學,每天只需 10 分鐘,就能從基礎語法到專案實作,逐步學習網頁開發,包含 HTML、CSS、JavaScript、DOM 操作、Canvas 等,並以 Road Map 呈現學習進度。即使零基礎也能輕鬆入門,開啟程式設計之路。
Thumbnail
自己在剛開始進入前端領域時,很剛好遇上需要使用 TypeScript 的案子,一開始都是跟著前輩怎麼寫就怎麼寫,不太有其他餘力來思考「為什麼」會需要寫這門程式語言,直到自己後來使用了 TypeScript 完整開發了電商的購物流程,才慢慢理解到使用 TypeScript 的好處與優勢。
Thumbnail
自己在剛開始進入前端領域時,很剛好遇上需要使用 TypeScript 的案子,一開始都是跟著前輩怎麼寫就怎麼寫,不太有其他餘力來思考「為什麼」會需要寫這門程式語言,直到自己後來使用了 TypeScript 完整開發了電商的購物流程,才慢慢理解到使用 TypeScript 的好處與優勢。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
JavaScript 中的 ESM(ES Modules)和 CJS(CommonJS)是用於模塊化開發的兩種不同的模組系統。 關於CJS CJS 是 CommonJS 的模塊系統,最初是為了在伺服器端使用的 Node.js 開發而設計的,但也被廣泛用於前端開發。CJS 使用 require 函數來
Thumbnail
JavaScript 中的 ESM(ES Modules)和 CJS(CommonJS)是用於模塊化開發的兩種不同的模組系統。 關於CJS CJS 是 CommonJS 的模塊系統,最初是為了在伺服器端使用的 Node.js 開發而設計的,但也被廣泛用於前端開發。CJS 使用 require 函數來
Thumbnail
JSON 全名 JavaScript Object Notation,其格式基本上就是key: value的組成如下: { "name": "Bob", "age": 40, "childs": [ { "name": "Justin", "
Thumbnail
JSON 全名 JavaScript Object Notation,其格式基本上就是key: value的組成如下: { "name": "Bob", "age": 40, "childs": [ { "name": "Justin", "
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
在初學程式的時候,我曾經看室友開發專案到一半時,突然坐在那發呆,於是我好奇一問,室友說:「我在等程式編譯完成啊。」 還記得當初還是程式小菜雞的我,懞懂無知的說:「編譯?哈哈哈,我們 JavaScript 都不需要編譯耶,可以直接跑在瀏覽器上。」 室友一臉莫名其妙地回我:「噢,是嗎⋯⋯」
Thumbnail
在初學程式的時候,我曾經看室友開發專案到一半時,突然坐在那發呆,於是我好奇一問,室友說:「我在等程式編譯完成啊。」 還記得當初還是程式小菜雞的我,懞懂無知的說:「編譯?哈哈哈,我們 JavaScript 都不需要編譯耶,可以直接跑在瀏覽器上。」 室友一臉莫名其妙地回我:「噢,是嗎⋯⋯」
Thumbnail
如果你曾經撰寫過網頁,那你一定接觸過 JavaScript 無論是在 NodeJs 或是瀏覽器中運行。 但你有沒有想過,我們寫下的 JS 程式碼,這些看似單純的英文和符號,是如何被轉化為機器能夠理解和執行的程式呢? 今天,讓我們一起深入了解其中的核心主角 ——Google 開發的開源 Java
Thumbnail
如果你曾經撰寫過網頁,那你一定接觸過 JavaScript 無論是在 NodeJs 或是瀏覽器中運行。 但你有沒有想過,我們寫下的 JS 程式碼,這些看似單純的英文和符號,是如何被轉化為機器能夠理解和執行的程式呢? 今天,讓我們一起深入了解其中的核心主角 ——Google 開發的開源 Java
Thumbnail
許多初學網頁開發的朋友們,一開始都不太理解HTML、CSS、 JavaScript之間的差異性,導致初期規劃學習計畫時毫無頭緒。 會有這樣的困擾,主要在於不了解HTML、CSS、 JavaScript之間的關係,以及這三者在網頁運作時所扮演什麼角色,導致越學越阿雜的狀況。
Thumbnail
許多初學網頁開發的朋友們,一開始都不太理解HTML、CSS、 JavaScript之間的差異性,導致初期規劃學習計畫時毫無頭緒。 會有這樣的困擾,主要在於不了解HTML、CSS、 JavaScript之間的關係,以及這三者在網頁運作時所扮演什麼角色,導致越學越阿雜的狀況。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News