iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 13
1
自我挑戰組

後設鐵人:我從其他鐵人們身上學到的事系列 第 13

後設鐵人 Day13:再見網友

不免俗地再來介紹幾個關注的新系列:

  1. Android Pie 底層開發學習心得
  2. 小學渣入門資安的30天之聽說是第二次挑戰ヽ(✿゚▽゚)ノ
  3. 還在想要買哪一堂線上課程嗎?培養看文件的習慣吧!用 MDN 文件學後端:NodeJS & MongooseDB
  4. 透過 LeetCode 解救美少女工程師的演算法人生
  5. 從 Hooks 開始,讓你的網頁 React 起來
  6. 瀏覽器的原理與優化 1,2,3
  7. Web Security 魔法使攻略
  8. 跟我一起上課吧:了解 JavaScript 的奇怪部分
  9. 報告老師,我可以當小老師嗎?前端超新手眼裡的網頁開發超基礎
  10. Hello, World! 線上課程學程式?你應該要知道的 30 件事

原本還有考慮關注一下 flutter 的系列文,後來發現如果關注了好像就關注太多東西了...突然覺得寫這系列也是挺累的,要看滿多東西的QQ

然後我今天突然發現念美術的女孩不可能學會資料結構與演算法?居然斷賽了QQ

[DAY03] 上帝視角之路徑之熟門熟路老司機之資料夾說明,喜歡裡面對 README.md 的翻譯:看我,媽的

JavaScript 初心者筆記: 在迴圈中 take a "break" 裡面提到「在 if 裡面使用 break」會讓我覺得小奇怪,break 就是在迴圈裡面用的,你要放在迴圈裡面任何一個地方都可以,所以當然也可以放在 if 裡面。而原文那樣的講法我有一瞬間會以為:「原來 if 也有 break 可以用」之類的

什麼?又是/不只是 Design Patterns!? 這系列很值得期待啊,居然是 PicCollage 團隊寫的,非常期待後續的發展。

再來是[課前規劃] 我所接觸的前端洋蔥劍士這篇,裡面提到的 redux 問題我覺得滿不錯的,但其他部分有些不是那麼認同,例如說:

(function(){
	var a = 5;
	b = a;
})()

console.log(b);

像這一題,一半以上的人都答錯。但這問題不是我發明的,網路上很多這樣類型題目的討論。Javascript的掌握度與是否會寫出有bug的JS,程度就在這裡看出來了。

我前陣子在反思面試題這件事情,因為自從我出社會到現在為止,我都沒辦法百分之百肯定這些網路上常見的前端面試題。我其實不覺得這些是好題目,因為它們脫離了日常開發。

像是上面那樣子的程式碼,你在寫的時候真的會忘記在 b 前面加 var 嗎?就算真的忘了,也有 ESlint 可以幫忙提醒你這樣做是不行的。

或者是那些考 hoisting 跟 this 是什麼的題目,那些程式碼真的會在開發程式的時候寫出來嗎?真的會需要去找說這邊的 a 是多少,這邊的 b 是多少,以及這裡的 this 是多少嗎?如果真的需要找,那會不會是因為程式本身就寫得差,而根本不是懂不懂 hoisting 的問題?

不知道沒有加 var 會被宣告成全域變數,不知道 hoisting 的順序,是有關係的嗎?還是其實一點關係都沒有?

其實我自己對這個問題也還沒有一定的答案,因為一方面覺得開發上不會碰到這些問題,好像沒關係,但另一方面又覺得如果不懂的話,好像就對 JS 沒那麼熟?

總之讓我們先退一步,先認可這些是重要的,但我認為在面試題上面還有很大的改進空間,而且居然沒什麼人(或沒什麼人公開分享)這一塊。我這次鐵人原本有想報一個題目是:「更好的 JavaScript 面試題」,但後來力不足就放棄了。我覺得很多考題可以設計得更好,更貼近日常開發上會碰到的問題,或至少讓考題有個情境,而不是丟給你一堆 a b c d 問你輸出是什麼。

舉例來說,可以看看底下這一題:

小明在公司的程式碼裡面發現了底下這一段,會幫 String 的 prototype 加上一個叫做 addPrefix 的 method,呼叫之後會把字串加上公司的 prefix:

String.prototype.addPrefix = function() {
  return 'huli_' + this
}

const str = 'hello'
console.log(str.addPrefix()) // huli_hello

可是後來公司決定有些數字也必須要使用這個 method,在數字前面也加上 prefix,可是主管決定使用同一個 function。如果今天你有一個儲存數字的變數叫做 num,也想要呼叫 addPrefix 這個方法,那 console.log 裡面應該要怎麼寫呢?

const num = 123
console.log( /* ???? */) // huli_123

以上就是這個題目。

先來講講最簡單的回答,就是把數字轉型成字串,例如說:

console.log(num.toString().addPrefix())
console.log((num + '').addPrefix())

這邊可以考說是不是知道怎麼把數字轉型成字串。

接下來進入到延伸問題了:「那如果不能把 num 轉成字串呢?不能使用 .toString 跟 + '' 這些用法」。

讓大家思考一下,我防雷

.
.
.
.
.
.
.
.
.
.
.

好,答案就是:String.prototype.addPrefix.call(num) 或者是 String.prototype.addPrefix.apply(num)

那這題考的是什麼?考的是你知不知道 call 跟 apply 可以帶入 this,就可以利用這方法去呼叫 addPrefix。我覺得這種考法比直接給你一段 call 的程式碼問你說 this 是什麼好,因為這題直接考你會不會用。如果你知道能這樣用,就代表你知道原理是什麼;但如果你只知道原理是什麼,你不一定知道要用在哪邊。

所以這一題其實是在考 call/apply/this 的理解。

還有一題是這樣的:

小牛的 JS 程式碼之中有這麼一段(這只是部分程式碼而已,前面跟後面還有東西):

// 前面程式碼略過
setTimeout(() => {
  alert('hello')
}, 1000)
// 後面程式碼略過

可是執行這整個程式以後,alert 卻在 2 秒後才跳出來,這有可能發生嗎?無論你覺得可能或不可能,都請試著解釋原因。

這題有興趣可以在底下留言回答,之後我再找時間公佈答案 ?
不過這題目可以再包裝一下就是了

話說我之前也有做了一個前後端基礎觀念題,一共十題,有興趣也可以去看一下,應該都是你沒見過的題目。

好,再回到一開始探討的那篇文章,裡面也提到說:

從來沒有人跟我要求,問我「我可以用手機查一下語法嗎?」,從來沒有。像這種隨時可以google的年代,我本來就不期望一個人什麼都知道,重點是他知道如何找到解決的方式。這跟回答或者心裡想著「這google不就知道了嗎?」是不一樣的,因為終究你沒有去google解決這個問題。

其實我不覺得這全然是面試者的問題。面試跟考試差不多,「一般來說」在考試的時候是不能查任何東西的,因為那就是作弊,相信大家應該都會同意這點。

所以我的問題是:「如果今天教授覺得期末考可以 open book 查資料,那應該是教授主動跟大家說可以 open book,還是學生必須主動問教授能不能開書考?如果學生沒有問,那是學生的問題嗎?還是是教授的?」

好,今天就先聊到這邊。


今天去找一個在倫敦的網友吃飯,好像是之前在臉書上傳訊息問我求職相關問題認識的。

除了吃飯以外順便去他們公司附近先晃晃,離倫敦橋不遠。一直都很喜歡這種在河邊散步的感覺。

https://ithelp.ithome.com.tw/upload/images/20190918/20091346ru8obmaryr.jpg

https://ithelp.ithome.com.tw/upload/images/20190918/20091346U4GvesovKK.jpg

晚上吃了平價的 wetherspoon,真的很平價欸,點了個 mixed grill + cider 才 11 英鎊左右,折合台幣約四百多塊,我覺得在台北吃應該也要差不多的價格。

明天下午要飛荷蘭阿姆斯特丹了,住宿 10 點就要 checkout,可是飛機下午四點才飛...但沒辦法也只能先去機場了,希望英國主場的英航可以提早 check in,不然就麻煩了QQ


上一篇
後設鐵人 Day12:倫敦必吃美食
下一篇
後設鐵人 Day14:哈囉荷蘭
系列文
後設鐵人:我從其他鐵人們身上學到的事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
rainbowrain
iT邦新手 2 級 ‧ 2019-09-19 00:51:34

num.addPrefix 那題答對了~

第二題答案是可能的,前略或後略的程式可能是做了大量複雜處理的迴圈,或是被包在Ajax的後續處理之中要等待response,也可能外層又包了 setTimeout ,電腦當時的運算資源被其他程式搶走之類的

"更好的 JavaScript 面試題" 這個主題也好棒,想玩/images/emoticon/emoticon31.gif

我要留言

立即登入留言