hw5:自己的函式自己寫
其實仔細思考的話,你會發現那些陣列內建的函式你其實都寫得出來,因此這一題就是要讓你自己動手實作那些函式!
我們要實作的函式有兩個:join 以及 repeat。(再次強調,這一題要你自己實作這些函式,所以你不會用到內建的join以及repeat)
join 會接收兩個參數:一個陣列跟一個字串,會在陣列的每個元素中間插入一個字串,最後回傳合起來的字串。
repeat 的話就是回傳重複 n 次之後的字串。
join([1, 2, 3], ''),正確回傳值:123
join(["a", "b", "c"], "!"),正確回傳值:a!b!c
join(["a", 1, "b", 2, "c", 3], ','),正確回傳值:a,1,b,2,c,3
repeat('a', 5),正確回傳值:aaaaa
repeat('yoyo', 2)正確回傳值:yoyoyoyo
- 今天延續昨天卡住的地方,思考的是 join 這個函式怎麼實作
function join(arr, concatStr) {
if (arr.length === 0) {
return ''
} else if (arr.length === 1) {
return arr[0] + concatStr
}
let ans = arr[0]
for (var i=1; i<arr.length; i++) {
ans = ans + concatStr + arr[i]
}
return ans
}
console.log(join(['a'], '!'));
// 正確回傳值:a -> 這裡我理解錯了,不是 a!
console.log(join([1, 2, 3], ''))
//正確回傳值:123
console.log(join(["a", "b", "c"], "!"))
//正確回傳值:a!b!c
console.log(join(["a", 1, "b", 2, "c", 3], ','))
//正確回傳值:a,1,b,2,c,3
- 其實上面寫的那一段是錯的,原因在於 join 這個函式,只能用在陣列裡面有兩個元素以上,假設陣列只有一個元素,那回傳值只有該元素,不會有其他東西。所以正確的程式碼應該是:
function join(arr, concatStr) {
if (arr.length === 0) {
return ''
}
let ans = arr[0]
for (var i=1; i<arr.length; i++) {
ans = ans + concatStr + arr[i]
}
return ans
}
console.log(join(['a'], '!'));
// 正確回傳值:a
console.log(join([1, 2, 3], ''))
//正確回傳值:123
console.log(join(["a", "b", "c"], "!"))
//正確回傳值:a!b!c
console.log(join(["a", 1, "b", 2, "c", 3], ','))
//正確回傳值:a,1,b,2,c,3
我的學習:
- 首先從結果來看,我要思考的是要怎麼把字串按照間隔放進去陣列裡面,我後來好好讀了題目,發現了線索「在陣列的每個元素中間插入一個字串,最後回傳合起來的字串」,合起來的字串,表示我應該要思考的方向是把陣列拆開,加上字串以後再合併。
- 接著通常陣列習慣都是從第一位開始跑,但這時候可以思考的是,陣列的第一位永遠不變,我應該要讓陣列從第二位開始跑才對。
str[0] + concatStr + str[1] + concatStr + ...
- 看了解答以後發現,還有一個情況是陣列是空的,這樣的話就要回傳空字串,因為就不能 join 了嘛~
- 把第二週的作業交出去了,看了第二週的自我檢討,好棒啊,好多值得學習跟複習的東西。
- 今天想把第二週複習一下,然後看一下第二週直播檢討影片
- 直播影片檢討:
- 卡很久怎麼辦?
- 跟著程式邏輯一步一步走,需要時間練習
- 默寫程式碼也許是一個方法
- 參考別人的作業
- 重點是找出自己的方法
- 宣告變數 var 的作用域在函數裡,let 的作用域在區塊裡,業界的做法是用 let,因為影響比較小。
- 老師的建議是初學者用 let
- 在 js 裡面 ‘;’ 是結尾使用的,但是這是可加可不加的。因為 js 有 ASI 機制,會自動在行尾插入分號。
- 沒有加分號有兩個地方可能會出錯:但是只要寫扣習慣好,可以避免掉一些錯誤。老師是不加分號派
- 遞迴
- 為什麼不相等?
- 卡很久怎麼辦?
var a1 = 'a'
var a2 = 'a'
var a3 = 'a'
console.log(a1 === a2 === a3)
會印出 false
原因在於電腦執行時是這樣跑的:
('a' === 'a') === 'a'
-> true === 'a'
-> false
做比較時,左右兩邊只能一個東西,要寫成
console.log(a1 === a2 && a2 === a3)
- 位元運算:
十進位:逢十就進位
二進位:逢二就進位:0 -> 10 -> 11 -> 100
位元運算整理