D18_第二週作業


Posted by Christy on 2021-05-06

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 了嘛~

  • 把第二週的作業交出去了,看了第二週的自我檢討,好棒啊,好多值得學習跟複習的東西。
  • 今天想把第二週複習一下,然後看一下第二週直播檢討影片

  • 直播影片檢討:
    1. 卡很久怎麼辦?
      • 跟著程式邏輯一步一步走,需要時間練習
      • 默寫程式碼也許是一個方法
      • 參考別人的作業
      • 重點是找出自己的方法
    2. 宣告變數 var 的作用域在函數裡,let 的作用域在區塊裡,業界的做法是用 let,因為影響比較小。
      • 老師的建議是初學者用 let
    3. 在 js 裡面 ‘;’ 是結尾使用的,但是這是可加可不加的。因為 js 有 ASI 機制,會自動在行尾插入分號。
      • 沒有加分號有兩個地方可能會出錯:但是只要寫扣習慣好,可以避免掉一些錯誤。老師是不加分號派
    4. 遞迴
    5. 為什麼不相等?
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
    位元運算整理









Related Posts

javascript 相關名詞

javascript 相關名詞

What a Bunch of ...  -  Bunching Estimation Methods

What a Bunch of ... - Bunching Estimation Methods

Day 2 - MongoDB 的 CRUD 教學

Day 2 - MongoDB 的 CRUD 教學


Comments