不免俗地再來介紹幾個關注的新系列:
原本還有考慮關注一下 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,還是學生必須主動問教授能不能開書考?如果學生沒有問,那是學生的問題嗎?還是是教授的?」
好,今天就先聊到這邊。
今天去找一個在倫敦的網友吃飯,好像是之前在臉書上傳訊息問我求職相關問題認識的。
除了吃飯以外順便去他們公司附近先晃晃,離倫敦橋不遠。一直都很喜歡這種在河邊散步的感覺。
晚上吃了平價的 wetherspoon,真的很平價欸,點了個 mixed grill + cider 才 11 英鎊左右,折合台幣約四百多塊,我覺得在台北吃應該也要差不多的價格。
明天下午要飛荷蘭阿姆斯特丹了,住宿 10 點就要 checkout,可是飛機下午四點才飛...但沒辦法也只能先去機場了,希望英國主場的英航可以提早 check in,不然就麻煩了QQ
num.addPrefix 那題答對了~
第二題答案是可能的,前略或後略的程式可能是做了大量複雜處理的迴圈,或是被包在Ajax的後續處理之中要等待response,也可能外層又包了 setTimeout ,電腦當時的運算資源被其他程式搶走之類的
"更好的 JavaScript 面試題" 這個主題也好棒,想玩