# 第二週 程式基礎(上) JavaScript 筆記 ## What 以前 JS 只能在瀏覽器執行,幫瀏覽器做基本運算。 node.js 是一個運行環境、執行環境(runtime),可以讓 JS 在瀏覽器外面跑,例如:你的電腦 JS 有基本共用的功能,例如 var/ if 等等,但不同 runtime 會提供不同的功能給 JS 。 document 只有瀏覽器有提供。console.log 兩邊都有提供,node.js 會在終端機 terminal 顯示。 在網頁裡,`f12`可以顯示 console.log ## 快速簡介 if/ else if/ else [ ] == array for (初始條件; 終止條件; 每圈要做的事情) {} 注意: return 代表在 function 裡面遇到要全部暫停並回傳的東西 一定要 console.log 才會輸出印出東西 但是 codewar 不看輸出 (console.log) 的值,只看回傳 (return) 的值 return 是玩遊戲按按鈕的概念,console.log 比較像是大喊:我完成了! 注意新的 online judge system 是看什麼 ## JS101 ### Syntax | Syntax | function | | | --------------------------------------- | ------------------------------ | ---- | | `node <file name>`<br />`Ctrl + C` 退出 | 把 file 用 node 的執行環境打開 | | | + - * / <br />a%b == a 除 b 餘多少 | 查看目前 commit 的狀態 | | | `console.log()` | print 出我要的東西 | | | &&<br />\|\|<br />! | and <br />or <br />not | | | | | | | | | | | | | | | | | | | | | | ### 基本運算( math 和遞增、遞減) | 語法 | 用途 | 用例 | 注意點 | | :--: | :----: | :---------- | :-------------------------------------------------------- | | + | 加號 | 1 + 2 // 3 | 前後空格 | | - | 減號 | 3 - 2 // 1 | 前後空格 | | * | 乘號 | 2 * 3 // 6 | 前後空格 | | / | 除號 | 4 / 2 // 2 | 前後空格 | | % | 取餘數 | 10 % 3 // 1 | 前後空格 | | ++ | 遞增 | i++ | eslint 不接受 i++ 會先跑完整句才加, ++i 會先加完再整句 | | – | 遞減 | i++ | eslint 不接受 i-- 會先跑完整句才減, --i 會先減完再跑整句 | | | 指數 | 2 ** 3 // 8 | | ### 邏輯運算 #### 短路性質 - && 與 || | and | result | | or | result | | | ---------- | ------ | ---- | ------------ | ------ | ---- | | **T** && T | T | | **T** \|\| T | T | | | T && **F** | F | | **T**\|\| F | T | | | **F** && T | F | | F \|\| **T** | T | | | **F** && F | F | | **F** \|\| F | F | | print 出決定的人,粗體代表是決定的關鍵 ( 注意:0 = F,其他大部分都是 T ) ex 10 && 3 == 3,F && 3 == F,0 && 3 == 0 3 || 30 == 3,F || 100 == 100,0 || 100 == 0 短路的性質在這裡的意思就是不會跑後面,在前面就短路了。 ### 位元運算 *** #### 位移運算 `<<` 和 `>>` 在二進位的世界裡,往左一位代表整個乘 2,同理往右代表除 2 EX:`10 << 1 == 20` ,因為 10 用二進位表示是 1010 ,整個往左一位變成 10100,換回十進位就是 20 若不能整除呢?他會無條件捨去 EX:`15 >> 1 == 7` #### 位元運算 一個符號 => 位元運算,對每個位數做邏輯運算 兩個符號 => 邏輯運算 EX:`15 & 10 == 15`,`15 && 10 == 10` | 語法 | 用途 | 輸入 | 輸出 | 二進位 | | :--: | :--: | :------: | :--: | :-------------------: | | & | and | 10&15 | 10 | 1010 & 1111 == 1010 | | pipe | or | 10 or 15 | 15 | 1010 & 1111== 1111 | | ^ | xor | 2 ^ 4 | 6 | 1010 & 1111 == 0101 | | ! | not | !15 | -16 | …00001111 …1111110000 | ### 變數 `var = 123`// 把 123 的值給 box 這個變數,也就是賦值 - 命名規範:大小有區別,不能用數字開頭,不能取名為 var。 - 命名方式: - 用底線區分(ex: blood_times_four) - 用大小寫區分 - 駝峰式(ex: BloodTimesFour),重點是要統一 undefined:有宣告,沒賦值 not defined:沒宣告 `++` & `--` `a + 1 == a++` `a++`和`++a`的差別 先執行程式判斷,再加一。先加再判斷 `var a = 0;` `console.log (a++ && 30 )` #### 變數型態 在 JS 不用一開始先指定型態,後面也可以變來變去 `type of "example"` 看 example 是什麼型態 - Primitive - number //42 - string //“42”, ‘42’ - boolean // true, false - object - array - object - null - 歷史悠久的 bug // typeof null === 'object' - function - undefined box[0] 索引值 index !在 JS 的 index 從 0 開始 ##### Array 用來存性質相近的東西 | Syntax | function | | :-----: | :------------------------ | | .length | 陣列長度 | | .push | 把 value 放到陣列最後一項 | 用中括號,用逗點隔開,可放初始值 ##### Object 用大括號 `var peter = {` name: 'peter', score: 100, address: 'taipei city' }` object & array 合併使用 student.push(peter) cosole.log(students[0]) 拿東西 (加 . ) console.log(students[0].score) or console.log(peter.score) or console.log(perter['name']) // 才可以放變數,所以通常中括號裡面會放變數 物件裡可以放任何東西,物件裡可以放陣列、也可以放物件。 #### 注意! - 運算時型態要注意 數字 + 字串 == 字串 // `10 + '20' == 1020` 怎麼辦? 可以事先轉成數字 // var a = '20' ; number(a) = 20 用新的 function `parseInt` // var a = '20' ; parseInt(a, 10) = 20 ,這裡的 10 代表十進位 - 浮點數誤差 你看到的 0.3 在電腦裡沒辦法存的那麼精準,可能是 0.30000005 所以可以的話盡量不要用小數 ### 到底等於還是不等於 | 符號 | 說明 | | | :---: | :------------------------------------ | -------------------------------------------- | | `=` | 賦值 | `var a = 10` // 把 10 放入 a 這個變數 | | `==` | 判斷相等(一般的等於) | == "0" // true<br />0 == null // false<br /> | | `===` | 判斷相等,還判斷型態(更嚴格的等於) | 0 === "0" // false | | `!=` | 允許 implicit coercion 的不等性檢查 | | | `!==` | 不允許 implicit coercion 的相等性檢查 | | ```a = 10 console.log (a=1)``` 執行順序 右到左 `a = 10 == 10`輸出 `true` `==` 要注意,可能型態不一樣會有 bug ,所以建議都用 `===`,比較不會出錯 ### 沒有如果 `if/ else` `if/ else if/ else ` `if (70 >= score >= 60)`// 跟想像不同,會由左看到右 所以如果有兩個以上的條件要用 `&&` > false 就只有幾個 0, null, 空字串 if 的條件`(number % 5 ===0)`也可以寫成`(!(number % 5))` 代表直接用 1 和 0 來判斷 第二種雖然程式碼比較少,可是可讀性比較低,不太能一眼辨識 > !寫程式縮排好習慣,一個 block 就要縮排,才能方便一眼辨識 ### Switch case `switch(要判斷的東西){要怎麼判斷}` 使用時機:當有三四個條件要判斷的時候,其實沒那麼多 注意:每個 case 最後記得要 break ![image-20200619160110749](https://i1.wp.com/lailalaii.files.wordpress.com/2020/07/image-20200619155950559.png?ssl=1) 兩個條件一樣的判斷可以一起寫 也可以寫一個 array 對應到中文的月份,這種對應式的題目,推薦用這個最簡潔 ![image-20200619160406844](https://i1.wp.com/lailalaii.files.wordpress.com/2020/07/image-20200619160406844.png?ssl=1) 小知識 ![image-20200619161415755](https://i2.wp.com/lailalaii.files.wordpress.com/2020/07/image-20200619161415755.png?ssl=1) 可以簡化成 ![image-20200619161451132](https://i2.wp.com/lailalaii.files.wordpress.com/2020/07/image-20200619161451132.png?ssl=1) ### 三元運算子 ternary `<條件> ? <true-顯示>: <false-顯示>` 原本![image-20200619161620962](https://i0.wp.com/lailalaii.files.wordpress.com/2020/07/image-20200619161620962.png?ssl=1)後來![image-20200619161931213](https://i2.wp.com/lailalaii.files.wordpress.com/2020/07/image-20200619161451132.png?ssl=1) 也可以巢狀,三元裡面還有一個三元,可是不好讀,直接用 if else 即可 - 練習一:判斷是否及格 請你自己寫出一段程式碼,是判斷一個叫做 score 的變數是否及格(超過或剛好 60 分),如果及格的話就輸出 pass,否則輸出 fail。 進階練習:除了判斷是否及格以外,也請你對滿分做出特別判斷,如果是 100 分的話就輸出 you are no1! ```js var score = 100 var message = score >= 60 ? (score == 100 ? 'you are no1!':'pass') : 'fail' console.log(message) ``` - 練習二:BMI 計算 > BMI 值的計算公式為:體重 / 身高^2。 > > 假設體重是 70,身高是 180(1.8m),BMI 就是 70/(1.8*1.8) = 21。 > > 現在請你寫出一個簡單的 BMI 計算器,用兩個變數代表體重跟身高,算出 BMI 之後判斷 BMI 是落在哪個範圍內並輸出相對應的字串。 > > 體重過輕:BMI < 18.5 > > 正常範圍:18.5 <= BMI < 24 > > 過重:24 <= BMI < 27 > > 輕度肥胖:27 <= BMI < 30 > > 中度肥胖:30 <= BMI < 35 > > 重度肥胖:35 <= BMI Method 1: for function ```js var BMI; var weight = 70; var height = 1.8; BMI = weight / (height ^2) if (BMI <= 18.5 ){ console.log('體重過輕') } else { console.log('正常範圍')} ``` Method 2: ### 迴圈 小括號放條件,大括號是一個 block #### Syntax - do while 迴圈 ``` do{ 迴圈要做的事情 } while (終止條件) ``` - while 迴圈 ``` while (終止條件){ 迴圈要做的事情 } ``` - for 迴圈 ```js for(初始值;終止條件; i 每圈結束要做的事情){ 迴圈要做的事情 } ``` What:重複做一樣的事情,通常都有一個終止條件,"無窮迴圈" 就會跳不出來,通常是終止條件設錯了 (!`label` `goto` JS 沒有) #### 在瀏覽器上面逐行檢查 1. 在 .html 的 code 裡面加上 'debugger' 2. 按 `f12` 顯示 console 3. 按 `f9` 逐行檢查,也可以用滑鼠回去看變數現在是什麼。也可以在右邊的 watch 打上有興趣追蹤的變數 點一下左邊的行數,就可以設置中斷點, run 之後它就會跑到這暫停,也可以設多個中斷點 #### do while 迴圈 如何阻止無窮迴圈? 1. 在 while 放跳出的判斷條件 2. 在 do 裡面放一個 if 範例 ```js do { console.log(i) i++ } while (true) ``` 解法一 ```js var i=0; do { console.log(i) i++; } while (i <= 10) ``` 解法二 ```js var i=0; do { console.log(i) i++; if (i>10){ break } } while (true) ``` #### while 迴圈 ``` while (終止條件){ 迴圈要做的事情 } ``` - do…while 和 while 差別在於 - while 先檢查再做。 - do…while 先做再檢查。 若不小心寫成無窮迴圈,`Ctrl + C`可以終止 #### for 迴圈 一個迴圈包含:一開始的初始值,終止條件,變數 i 每圈結束要做的事情 Syntax: ```js for(初始值;終止條件; i 每圈結束要做的事情){ 迴圈要做的事情 } ``` 初始值可以不寫 通常用在已經知道跑多少圈的時候 - 範例 `continue` 和 `break`的差別 `continue` :跑到迴圈下一圈 ```js for (i=1 ; i <= 5 ; i++){ if(i===3) continue console.log(i) } // output == 1245 ``` ​ `break` :直接跳出迴圈 ```js for (i=1 ; i <= 5 ; i++){ if(i===3) break console.log(i) } // output == 12 ``` 與陣列搭配 ```js var score=[2,5,7,10,11]; for (var i=0 ; i <= 5 ; i++){ console.log(score[i]); } ``` ## 綜合題目練習Lv1 ### 練習一:印出一到九 ```js /* for (var i=1;i<10;i++){ console.log(i); } */ var i=1; while(i<10){ console.log(i); i++; } ``` ## 函式 function y = f(x) // y = 回傳值,x = 參數 - 可以藉由名稱來 call function - call function 時要包含`()` - 例: `console.log(functionName())`,否則會印出他是一個 function - 函式參數命名時盡量用有語意的字當參數增加可讀性 - 需要時可用 return 來回傳值 - 可以傳任何東西,包含物件 - 注意 return 後面不可以空白,不然會是 undefine,且把後面的當成兩句。所以就算是一大串還是要至少有一個前括號在同一行 ```js function generateArray(n){ var array = [] for ( var i=1 ; i<=n ; i++){ array.push(i) } return array } console.log(generateArray(5)) ``` ### 宣告 ```js //方法1 function hello() { console.log('hello') } //方法2 var hello = function(){ console.log('hello') } //方法3 ES6 const hello=() => { } ``` ### 函式中的函式 function 的參數也可以是一個 function, return 也可以回傳一個 function ```js function transform(arr, transformFunction){ var result = [] for (var i=0; i<arr.length; i++){ result.push(transformFunction(arr[i])) // 函式 transform 由兩個參數組成,分別是 arr, transformFunction // 透過 for 迴圈把 arr的每個元素數字經過 transformFunction之後都丟進 result 這個 array 裡 } return result // 回傳 result } function double(x){ return x*2 } console.log( transform([1,4,6], double) //[1,4,6] & double 是 transform 的引數 ) // 也就是把 transformFunction 當成一個可變的 function,能動性比較高 // 再另外寫一個 function 來定義要哪一種 transform ``` ### anonymous function 匿名函數 也可以把回傳的 function 直接寫進 console 裡面,變成一個 anonymous function 例: ```js function transform(arr,transformFunction){ let result = [] for(var i = 0; i < arr.length; i += 1){ result .push(transformFunction(arr[i])) } return result } console.log( transform([1, 2, 3], function(x){ return x * 2 }) ) ``` ### Parameter (參數)和 argument (引數) 參數:本身 function 定義的東西 引數:放進 function 參數裡的數值,也可以是另一個 function ![img](https://i.imgur.com/YwFCJZm.png) [參考資料](https://ithelp.ithome.com.tw/articles/10204008) - ### arguments JS 裡面有內建 arguments,可以把引數 print 出來 ```js function add(a,b){ console.log(arguments) return a+b } console.log(add(2,5)) // [Arguments] { '0': 2, '1': 5 } // 7 ``` argument 是一個物件,而不是陣列。 **`arguments`** 物件是一個對應傳入函式之引數的類陣列(`Array`-like)物件。//白話文運動:很像陣列的物件 ### function 傳參數機制 - 裡面改外面? function 本身的運作機制比較像是複製一份過去,所以不會改到原本的,尤其是三種基本類別:數字、字串、布林 但是像是物件、陣列的話,裡面就可以改外面的,因為指向同一個東西 用等號去指向新的東西的話,就不會改到另外一個 - 用 dot notation 的時候會改到外面的 ![img](https://i.imgur.com/fGWhtuV.png) 上面這種方式就叫做:`call by value`(或是 `pass by value`),在呼叫` function` 的時候把「值」給複製一份 > 宣告一個 object 的時候,在底層實作上,其實這個 object 存的是一個記憶體位置 ### return - 不需要知道結果的 - 不需要寫 return - call function 時電腦不會得到回傳值 - 這時 return value 的預設就是 undefine - 會需要知道結果的 - 需要 return - 注意,在 function 中,電腦一遇到 return 就會立刻回傳,然後跳出function,所以在 return 後面的程式碼就不會被執行。 - 若 function 裡面沒有 console (也就是 call 的功能),那麼即使放入引數 `node index.js` 也不會有反應,不然就是在外面 console.log 也行 ## 內建函式 ### Number 類型 #### `Number()`:字串轉數字 #### `parseInt(變數, 進位制)`:字串轉整數,小數會直接省略 #### `parseFloat(變數)`:字串轉浮點數 #### `.toString()`:數字轉字串 `a + ''` 也有相同效果 #### `Number.MAX_VALUE` 得知可儲存的最大值,超過的話數字會變得不精準 #### `Math.PHI`:~ 3.14 ,常數通常用大寫 #### `Math.ceil()`:無條件進位 `Math.ceil(10.9)` = 11 #### `Math.floor()`:無條件捨去 `Math.floor(10.9)` = 10 #### `Math.round()`:四捨五入 `Math.round(10.9)` = 11 #### `Math.sqrt()`:開根號 `Math.sqrt(9)` = 3 #### `Math.pow()`:次方 `Math.pow(2.10)` 等於 2的 10次方 === 1024 #### `Math.random()` 0 <= random < 1的隨機數,可以產生 1~10 的隨機數字 `console.log(Math.floor(Math.random()*10)+1)` // 乘十倍、加一、取締版 ### [String 類型](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String) #### `<str>.length` 數字串有幾個字,空格也算 #### `<str>.toUpperCase()`:轉大寫 //注意,括號不能省 #### `<str>.toLowerCase()`:轉小寫 #### `<str>.charCodeAt()`:字母轉數字 得到某個字母的 ASCII code 代號,大小寫的代號差 32 例如想知道 `a = 'dkf'` 中 f 的 ASCII code,就用 `a.charCodeAt(2)`// 2 代表第 3 個字母 判斷是不是小寫? 檢查有沒有在中間就好,因為照順序排,同理判斷是不是大寫或是是不是字母 ```js var char = 'k' console.log( char >= 'a' && char <= 'z') ``` #### `String.fromCharCode(數字)`:數字轉字母 查詢 ASCII code 代表的字串 #### `<str>.indexOf('詞')` 查詢詞在字串中的位置,數字代表這個詞在第幾個位置。 若回傳值小於零,代表詞不存在字串內 #### `.replace('被替換', '替換')` 取代字串中的某一個詞,只會找位置最前面的替換,其他的不會變。例如 `'hey hello'.replace('h', '!!!')`,只會變成 `!!!ey hello` 如果有不只一個 h ,只會換第一個 // 如果要一次換多個,可以用正規表達式 regex ,以後會提, g 代表 global #### `<str>.split()`:切割字串 ​ `.split(' ')` 以空格分、`.split(',')` 以逗號分、`.split("")`切字母`.split()`不切 #### `<str>.strim()`:消除前後空格 ### [Array 類型](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) 注意:`join()` 回傳的結果是字串,`filter()`回傳的結果是 array #### `.join()` 在陣列中插入某元素,**變成字串**。`[1, 2, 4].join('!')` 結果是 `1!2!3` #### `.map(變數)` ​ :將變數帶入陣列中每個元素,而且可以多次操作。 ```js var arr = [1, 2, 4] console.log( arr .map(function (x) { return x*-1 }) .map(function (x) { return x*2 }) ) ``` #### `.filter()` 過濾,true 會留下、false 會不見 ``` var arr = [1, 2, 4] console.log( arr .map(function (x) { return x*-1 }) .filter(function (x) { return x > 0 //正數會留下,負數被過濾掉 }) ) ``` #### `.slice()` 切陣列,回傳新的陣列,**不會改動**到原有陣列。以陣列 a = [1, 2, 3, 4, 5] 為例: - `a.slice(2)` = [3, 4, 5] - `a.slice(2, 3)` = [3] - `a.slice(2, 4)` = [3, 4] #### `.splice()` 切陣列,**會改動**原陣列。以陣列 a = [1, 2, 3, 4, 5] 為例: - `a.splice(1, 0, '100')` = [1, 100, 2, 3, 4, 5],在 a[1] 位置,刪除 0 個元素,插入 ‘100’,插入的感覺 - `a.splice(4, 1, '100')` = [1, 2, 3, 4, 100],在 a[4] 位置,刪除 1 個元素,插入 ‘100’,取代的感覺 #### `.sort()` 排序,預設值依照「字母順序」排列 - 陣列是 months = [‘March’, ‘Jan’, ‘Feb’],`months.sort()` = [‘Feb’, ‘Jan’, ‘March’] //照字母順序排 - 陣列是 num = [1, 30, 4, 21],`num.sort()` = [1, 21, 30, 4] //當字串,只看第一個數字 若要依照數字順序排列陣列元素,可以用此方式 ```js var arr = [1, 30, 4, 21] //要由小排到大 arr.sort(function(a, b){ //想像成 a 是排在前面的數字、b 是排在後面的數字 if (a===b) return 0 if (b > a) return -1 //-1 代表不換位置 return 1 //1 代表兩個交換 }) console.log(arr) === //要由大排到小 arr.sort(function(a, b){ //想像成 a 是排在前面的數字、b 是排在後面的數字 if (a===b) return 0 if (a > b) return -1 //-1 代表不換位置 return 1 //1 代表 a b 互換位置 }) //其他寫法1 arr.sort(function(a, b){ //想像成 a 是排在前面的數字、b 是排在後面的數字 if (a===b) return 0 return a > b ? -1:1 // 三元運算子 }) //其他寫法2 arr.sort(function(a, b){ //想像成 a 是排在前面的數字、b 是排在後面的數字 return b - a // === 0 ,代表兩者相等,所以回傳 1 不換; 如果 > 0 ,不動,回傳 -1; 如果 < 0 ,互換,回傳 1 }) ``` ### 易出錯 #### log & return 舉例 ``` function add(a,b){ console.log(a,b) //當 function 裡面沒有 return ,預設就是return undefined } console.log(add(1,2)) /* return: 1 2 undefined 因為先執行 add(1,2),所以把 1 2 log 出來,接著因為 function 沒有 return 值,所以跑出 undefined ``` 在 chrome 裡面: ​ 沒箭頭:console.log 呼叫出來的興 ​ 有箭頭:執行完的回傳值 #### Immutable 不可變 原始型態:除了物件以外都是 直接改變的: push, pass, reverse, shift, sort, splice, unshift 注意看 return 是什麼,例如 array.push 會直接改變原本的 array ,而且回傳新陣列有幾個元素 不會改動的:通常代表它回傳的東西本身不是一個 array 要搞不清楚是回傳新的還是改變,還是都有 對於 number 和 string 來說,直接用 function 是沒有用的,要用一個新的變數來接 ``` var str = "hello" str.toUpperCase() //沒有用,因為 str 本身不會改變 str = str.toUpperCase() //才會把便的東西放進 str,是不同的存取空間 ``` 對於 object 和 array 來說,如果回傳的不是 array ,要用一個變數去接 ## ALG101 ### 參考資料 [[課程學習筆記 ]先別急著寫 leetcode — 一步步打造程式腦]([https://medium.com/@miahsuwork/%E8%AA%B2%E7%A8%8B%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98-%E5%85%88%E5%88%A5%E6%80%A5%E8%91%97%E5%AF%AB-leetcode-%E4%B8%80%E6%AD%A5%E6%AD%A5%E6%89%93%E9%80%A0%E7%A8%8B%E5%BC%8F%E8%85%A6-7ed12aaa4a3d](https://medium.com/@miahsuwork/課程學習筆記-先別急著寫-leetcode-一步步打造程式腦-7ed12aaa4a3d)) ### LIOJ 題目 leetcode: 幫你定義好 function 還有 input 的參數 `Ctr + d`:送出結果訊號 `Ctr + c`:直接關掉 1.直接執行、直接輸入,可是 window 好像不是 `Ctr + D` 2.直接呼叫 function 3.做一個 input.txt 的檔案,放入 .js // `cat input.txt | env node code.js` ### pseudo code > *打造工程腦* > > 第一步:**想解法** > > 第二步: pseudo code 虛擬碼 | 想解法 | 翻成英文 | pseudo code | real code | | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | | 1. 令 i = 1 <br />2. 如果 i > 100,結束<br />3. `**如果 i 能被 2 整除,印出 i**` <br />4. i = i + 1 <br />5. 跳回第二行 | 1. let i = 1 <br />2. if i > 100, then exit <br />3. if i % 2 no remainder, print i<br />4. i = i + 1 <br />5. jump to line 2 | 1. let i = 1 <br />2. for (i from 1 to 100) do <br />3. if i / 2 no remainder, print i <br />4. end for | ![image-20200624142729188](C:\Users\柔均\AppData\Roaming\Typora\typora-user-images\image-20200624142729188.png) | JSON.stringfy(??) ### 型態限制 1. int: -2147483648 ~ 2147483647 2. JS 數字: Number.MAX_SAFE_INTEGER 3. 浮點數精準度問題 ### 解程式三寶 迴圈、函式、判斷式 ## 作業注意 1. 解題小訣竅:把 function 大區塊先寫出來,再填肉。 2. 印出/輸出:要 log 出東西,在 function 內用 console.log 回傳:在 function 內用 return 回傳代表這整個 function 代表的值,但不一定要輸出 大家一定要很清楚地知道 console.log 就只是「印出」,把任何東西印在你的執行環境上面。你在 Node.js 下 console.log,就會在你的terminal 上面印出東西。你在瀏覽器下 console.log,就會在瀏覽器的 console 印出結果。 但你要知道的是,印出的結果是給誰看的?給人看的。所以對電腦來說,console.log 是沒有什麼意義的。 3. 寫方程式記得最後的output是return,不然會有很多undefined - NM 乘法表 1.字串跟數字做大小判斷 ```js let N = lines[0] //為什麼沒有取Number也可以運算? let M = Number(lines[1]) console.log('type of N before = ', typeof((N))) if(N<5){ console.log(true) } //字串本身也可以直接跟數字做大小判斷 console.log('N=',N) console.log('type of N after = ', typeof((N))) ``` 2.字串做數學運算之後變成數字 ```js let N = lines[0] //為什麼沒有取Number也可以運算? let M = Number(lines[1]) console.log('type of N before = ', typeof((N))) N++ //N 做數學運算之後會從字串變成數字 console.log('N=',N) console.log('type of N after = ', typeof((N))) ``` 3.輸出組合時用`,`還是`+`? `console.log(i,'*',j,'=',(i*j))` => 不會通過 `console.log(i+'*'+j+'='+(i*j))` => 通過 - 水仙花數 1. `typeof lines= object typeof lines[0]= string` 2. `.split(' ')` `var tmp = lines[0].split(' ')` //切開之後要把結果用另一個變數存,沒辦法直接改原本的東西 ## Issue - #### 沒有該指令 ~~run~~ => `start <file>` in window,`f12` then ~~node~~ => 要下載 node.js - node -v `Uncaught ReferenceError: node is not defined` - .js 的檔案到底可以用什麼開? 暫時用 freecodecamp - 怎麼做出一個 array 讓判斷條件對應? BMI 題目 - 名詞搞混區 - Git Bash 是什麼? Windows 版的 Git 模擬器,也可以當 cmder 使用(?) - node.js 是什麼? npm 呢? 可以讓 terminal (?) 執行 js 的軟體(?) > **npm** > node package management,管理 JS 套件的系統。 > > node.js 的預設管理套件工具。裝 node.js 的同時也會一並自動安裝。 > > - `npm init`:啟用,會在專案資料夾內新增一個 package.json 檔 > - `npm install <套件名稱>`:安裝套件,安裝完成的套件會統一放在 node_modules 資料夾內。 > - `var <變數名稱> = require("<套件名稱>")`:在檔案內引入套件來使用 - VS code 是什麼? 可以在上面打 - 小偷題目,exchange 在當成function寫,怎麼改陣列裡的數字(?) ## 參考資料 1. [JS101 筆記](https://hackmd.io/@keronscribe/js101-note#JS101-筆記) by 第三屆 Cian 2. [Introduction to JavaScript](https://hackmd.io/@laiyenju/introduction-javascript) by 第四屆 Yen (Lai Yen Ju) 3. [JavaScript - 變數,陣列,函式](https://hackmd.io/DzIhhWOzRrCHBOX1So5E8Q?view#新增元素1) by 第三屆 ruofanwei 肉丸