怎麼讓一般人聽懂工程師腦裡的「交換」

簡單的事情,不要想得太複雜。

簡述

這篇文章是我某天腦洞突然開而想出來的,目的是希望讓沒有程式基礎的人也能理解「在程式的世界裡,把兩個東西交換」代表的意思是什麼。

說故事時間

如果你沒有學過程式,那你腦袋中的「交換」應該是長這樣子:

thinking-01

但有學過程式的人腦中的「交換」卻是長這樣子:

thinking-02

WTF?工程師是吸了什麼?為什麼要用這麼反人類的方式思考?在我還不懂程式的時後我也疑惑過這個問題。

但其實我們每個人都有過這種思考模式,只是沒有發現而已。所以我接下來就來解釋到底是什麼事情?

取錯檔案名稱的慘痛

不知道你有沒有這樣的經驗,像是把兩張圖片的名字取錯,像這樣:

wrong-name

那你該怎麼把這兩個名字交換?我相信大部分人應該是這樣子做的:

change-name

(備註:我女友直接嗆說「我都直接改名稱欸,例如:『宇宙大燒賣-01』,只有你用這種做法吧」。好啦…如果你不是這樣子做的話,那你就當今天學到一種新的做法吧!)

把詳細步驟寫出來的話就是:

  1. 複製一個宇宙大燒賣,得到「宇宙大燒賣-複製」
  2. 把「宇宙大燒賣」刪除
  3. 把「黃金比例燒賣」改成「宇宙大燒賣」
  4. 最後把「宇宙大燒賣-複製」改成「黃金比例燒賣」
  5. 完成!

為什麼要先複製一份?很簡單嘛,因為「不能有同樣的檔案名稱啊」,這個道理大家都很清楚,在寫程式的時也是一樣,只是稍微換個角度來思考而已,但背後的道理都一樣。

其實理解到這邊就差不多了,接下來的部分只是讓有興趣的人學個概念,看不懂也沒關係。

首先要知道在程式的世界裡你不能幫變數改名稱,只能改變數的值。

意思是說假設我有兩個變數:

1
2
let picture1 = '宇宙大燒賣.jpg'
let picture2 = '黃金比例燒賣.jpg'

你絕對不可能直接把 picture1 改成 picture2,你只能透過「變數值」來修改變數:

1
2
picture1 => picture2 // 錯誤的做法
picture1 = '宇宙大燒賣.jpg' // 正確的做法

所以要怎麼把兩個變數的值交換?很簡單嘛,直接「重新賦值」就好啦:

1
2
picture1 = picture2  // 把 2 的值給 1
picture2 = picture1 // 把 1 的值給 2

但這樣子是不對的,在你做 picture1 = picture2 的時候,picture1 的值就已經不是原本的值了,所以下一行 picture2 = picture1picture1 會是重新賦值後的值,你仔細思考一下每個步驟就能理解意思了:

1
2
picture1 = picture2  // picture1 的值變成 '黃金比例燒賣.jpg'
picture2 = picture1 // picture2 參考的值還是 '黃金比例燒賣.jpg' 不是 '宇宙大燒賣.jpg'

那要怎麼做才是對的?用我們一開始說的「複製」大法:

1
2
3
picture1_copy = picture1  // 先複製一份 '宇宙大燒賣.jpg'
picture1 = picture2 // 把原本的 pictur1 改成 '黃金比例燒賣.jpg'
picture2 = picture1_copy // 最後再把 picutre2 改成複製好的 '宇宙大燒賣.jpg'

這樣子做就可以避免掉剛剛的問題,正確的讓 picture2 儲存原本 picture1 的值。而這也是為什麼工程師要多繞一圈的原因。

結尾

其實就是我腦袋突然想到的想法而已,我也不確定這種說法有沒有比較好理解一些,如果你覺得沒有很好理解的話那絕對是我文筆不好的問題,不是你的錯。

總之呢,就當作我隨便寫寫廢文,大家隨便看看就好。

學 hoisting 之前先理解 EC 是什麼? function 中的 call apply bind
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×