zuppachu / Joanne-s-Learning-Blog

程式導師實驗計畫第二期 之 Coding 學習紀錄。
2 stars 0 forks source link

[ JS101 ] + [ JS201 ] - 課程筆記 #2

Open zuppachu opened 6 years ago

zuppachu commented 6 years ago

寫過才會記得住!(現在對此話抱持懷疑的心態 TT,但至少比較方便查閱!)

如何在終端機寫 JS?

<terminal>
vim index.js
console.log(123+2)
跳出 vim 按 control + c 或是 .exit

邏輯運算 vs 位元運算

邏輯運算 and/or/not

false || 10
=> 10

false && true => false


- ! (not)

!true => false

!false => true

### && 與 || 的短路性質
- or 的性質: 第一個不是 false 的話,就回傳第一個。

3 || 10 => 3

false || 10 => 10

0 || 10 => 10

- and 的特質:兩個是真的,就是由第二個決定

3 && 10 => 10

true && false => false

true && true => true

false && 3 => false (因為第一個值已經不是 true 了,後面就沒必要看了)

#
> 位元運算 (bitwise operators) :and `&`, or `|`, xor `^`, not `~`, 左移 `<<`, 右移`>>`, 右移填0`>>>`
- [AND] bit1 `&` bit2: 
當兩個位元都是 1 時 => 1 
- [OR] bit1 `|` bit2:
當其中一個位元是 1 時 => 1
- [XOR] bit1 `^` bit2 :
兩個位元一樣時 => 0 
兩個位元不一樣時 => 1
- [NOT] `~` bit :
當 bit 是 1 時 => 0 
當 bit 是 0 時 => 1

> 比較:

300 && 3 => 3 300 || 3 => 300

9 | 15 => 15 10 & 15 => 10

9 & 15 => 9 9 && 15 => 15

PS 可以看[這篇](https://ithelp.ithome.com.tw/articles/10129361)比較的更詳細。

# 變數的型態 (typeof)
基本有 (primitive):
var a = 0
console.log(a++ && 30) //  => 先console.log(a && 30),再 a = a+1
console.log(a)
//0
//1
var a = 0
console.log(++a && 30) //  =>先a = a+1,再 console.log(a && 30)
console.log(a)
//30
//1
a++ 可以理解为先返回了a的值(a先参与运算)再自增
++a 是先自增再参与运算
//a在前那就a先参与运算再自增,++在前那就先自增再参与运算

物件 (object)

物件是一種資料型態,用{}包起來。 W3School 說明物件可以包含屬性 (property) 和 函式 (method)。

var person = {
    firstName: "John", // property :  property value 
    lastName: "Doe",
    age: 50,
    eyeColor: "blue",
    father {
        name: 'Nick',
        phone: '0123456',
    }
};

取得物件裡面的值有兩種方式:

需注意:

  1. 型態!

    var a = '10'
    var b = 20
    console.log(Number(a)+b)
    // 30,將字串 10 轉成數字 10
    console.log(parseInt(a,10)+b)
    // 30。 (a,10) 十代表十進位。
    console.log(parseOnt(a,2)+b)
    // 22,因為二進位會把 10 當成二進位 => 2
  2. 浮點數誤差! 所有程式都會遇到的問題,在電腦內存數字無法存得很精準。

    var a = 0.1 + 0.2
    console.log(a == 0.3) // false
    因為 console.log(a) 為 0.3000000004

    字串加減乘除篇

  3. '12'+'23' // "1223"

  4. '1'-'2' // -1

  5. '2'*'2' // 4

  6. '4'/'2' // 2

    
    - 範例:
    ```js
  7. 字串 加 數字 = 字串數字 var x ='30' + 10 alert(x) //得 3010

  8. 數字 加 字串 = 數字字串 var x=5+"2" alert (x) //得52

  9. 數字 乘 數字 = 數字 var x=5*2 alert (x)  //得 10

  10. 字串 乘 字串 = 數字 var x="5"*"2" alert(x)  //得 10

  11. 數字 乘 字串 = 數字 var x=5*"2" alert (x) //得10    

  12. 字串 乘 數字 = 數字 var x="2" * 5 alert (x) //得10   

  13. 數字 除 字串 = 數字 var x = 10 / "2" alert(x) // 得5

  14. 字串 除 數字 =數字 var x = "20" / 5 alert(x) //得 4

    
    - special case
    ```js
    var a = Number('hello')
    console.log(a)
    // 得 NaN,因為無法將字串轉為數字

console.log(typeof a) // 得 number,是數字的一種,但不是真的數字。

console.log(a === a) // 得 false!!因為 NaN 跟 NaN 都不是數字,也無法匹配,所以也無法相比。


# 萬年經典題 == vs ===

- `=` 為賦值的意思。
- `==` 判斷值是否相等,但不判斷型態
- `===` 判斷值是否相等+型態
```js
console.log(a=1)
=> a=1
=> console.log(a) // 1
console.log(0 == '0') // true
console.log(0 === '0') // false

console.log(0 == ' ') // true
console.log(0 === ' ' ) // false
console.log(0 == null) // false

補充:重新認識 JavaScript: Day 07 「比較」與自動轉型的規則 看自動轉型規則部分。

建議永遠使用三個等號,比較容易看出問題在哪。

從 Object 的等號真正理解變數

「Object 物件」和「Array 陣列」可以想成是「存記憶體位置」,而非數值內容。

如下例:

console.log([] === [])                   
console.log([1] === [1])                 
console.log({} === {})                  
console.log({a:1} === {a:1})

//false
//false
//false
//false        
var obj = {a:1}
var obj2 = obj
console.log(obj === obj2)  
// true

物件存取的方式:

var obj = {a:1}
var obj2 = obj  //指向同樣記憶體位置
obj2.a = 2

console.log(obj === obj2)
console.log('obj: ',obj)
console.log('obj2: ',obj2)
//true
//obj: {a:2}
//obj2: {a:2}
var obj = {a:1}
var obj2 = obj
obj2.a = 2
obj2 = {b:1}  //obj2 指向新的記憶體位置,obj 和 obj2 無相關

console.log(obj === obj2)
console.log('obj: ',obj)
console.log('obj2: ',obj2)
//false
//obj: {a:2}
//ojb2: {b:1}
var a = []
var b = a
b.push(1)
b = [1,2,3]
console.log("a: ", a)
console.log("b: ", b)
console.log(a === b)

// a: [1]
// b: [1,2,3]
// false
zuppachu commented 6 years ago

Function:宣告函式的不同種方式 - 點解篇

一段腦衰與崩潰的故事。

故事是這樣的。這教學影片我看了三遍,但是有看還是沒看懂。突然想到老師之前說過:「搞不懂時,就把自己當電腦一樣,一行一行寫出來。」嗯,寫出來以後,我請老師過目~

一段腦衰與崩潰的故事就此展開😂

以下為原始題目:

function transform(arr,transformFunction) {

    var result = []

    for(var i =0; i < arr.length; i++)  {

      result.push(transformFunction(arr[i]))
    }

        return result
}

function double(x) {
    return x*2
}

console.log(transform([1,2,3],double))

看不懂怎麼解嗎? 沒關係。

先從最簡單的地方開始。

var result = []
result.push(0)
return result

result? [0]

var arr = [1, 2, 3]
console.log(arr[0])

會印出什麼? [1]

接著再來看

var result = []
var arr = [1, 2, 3]
result.push(arr[0])
return result

result 會是什麼? [1]

再看下去

function double(x) {
   return x*2
}
var arr = [1, 2, 3]
var result = []
result.push(double(arr[0]))
return result

result 會是什麼? [2]

再接著看下去。

function transform(arr,transformFunction) {
    var result = []
    result.push(transformFunction(arr[0]))
    return result
}
function double(x) {
    return x*2
}
console.log(transform([1,2,3],double))

result 會是什麼? [2]

紀錄一下跑程式(上圖)的過程:

=> arr[0] = 數字 1,所以
result.push(transformFunction(arr[0])) = result.push(transformFunction(1))

=> transformFunction(1) = dobule(x)

=> 跑 function double(x)    // x = 1

=> return x*2 => 1*2 = 2

⚠️重點⚠️

以下為簡易圖示

數字: [1,2,3]
位置:  0,1,2
題目再看一次,方便比較。

function transform(arr,transformFunction) {

    var result = []

    for(var i =0; i < arr.length; i++)  {

      result.push(transformFunction(arr[i]))
    }

        return result
}

function double(x) {
    return x*2
}

console.log(transform([1,2,3],double))

匿名函式寫法:

function transform(arr,transformFunction) {

    var result = []

    for(var i =0; i < arr.length; i++)  {

      result.push(transformFunction(arr[i]))
    }

        return result
}

console.log(transform([1,2,3], function(x) {
    return x*2
}
))

以下為上題程式跑法,有錯歡迎指正,感謝你~

(transform(1,2,3),double) 帶入 function transform

先跑 for loop

=> i = 0 => arr[0] => 0<3 (true) => result.push(transformFunction(arr[0]) => i=0+1 =1
=> i = 1 => arr[1] => 0<3 (true) => result.push(transformFunction(arr[1]) => i=1+1 =2
=> i = 2 => arr[2] => 0<3 (true) => result.push(transformFunction(arr[2]) => i=2+1 =3
=> i = 3 => arr[3] => 陣列內沒有3的位置 => (false) = stop

=> result.push(transformFunction(arr[0]) => result.push(transformFunction(1)) => transformFunction(1)=double(x) => 跑 function double(x) => x*2 = 1*2 => return result = [2]

=> result.push(transformFunction(arr[1]) => result.push(transformFunction(2)) => transformFunction(2)=double(x) => 跑 function double(x) => x*2 = 2*2 => return result = [4]

=> result.push(transformFunction(arr[2]) => result.push(transformFunction(3)) => transformFunction(3)=double(x) => 跑 function double(x) => x*2 = 3*2 => return result = [6]

result = [2,4,6]

呼~終於打完了!一整天就弄一個題目也是夠了 😂

zuppachu commented 6 years ago

Function

首先, Function 的結構

function 名稱(參數){
              內容
}
  1. 一個 function 也可以沒有返回值(return),亦即省略 return 語句,預設會返回 undefined
  2. return 後面記得要加東西,不然也會返回 undefined (影片處約 7:30)

宣告一個函式並不會執行它,要使用『呼叫函式』的語法(calling function),促使函式執行。

function addValue(a,b) {
     return a+b  //回傳不會顯示出來,要用 console.log() 測試程式才會。
}

addValue(1,3)  //呼叫函式的語法底加!
console.log(addValue(1,3))  //得4

Function 裡面可以放什麼?

//想要在陣列裡面數 3~10 function generateArray(From, To) {
var result = [] for (var i = From; i <= To; i++){ result.push(i) } return result } console.log(generateArray(3,10)) // 得 [ 3, 4, 5, 6, 7, 8, 9, 10 ]


- 放 function:
```javascript
function transform(x, transformFunction) {
    return transformFunction(x)   // function 裡面也可以放 function
}
function test(x) {
    return x*2
}
console.log(transform(10,test))     //20

宣告函式的不同種方式

  1. 最常見的方式,這個函式叫做 hello:
    function hello() {
        console.log('hello')
    }
  2. 宣告一個變數叫做 hello,這個變數等於一個函式:
    
    //function 也是一種資料型態

var hello = function() { console.log('hello') } //這函式是無名稱的,以變數為主。


3. 有點多此一舉的函式,但是還是列一下,怕以後沒看懂
```javascript
function transform(x, transformFunction) {
        return transformFunction(x)
}

function test(x) {
        return x*2
}

console.log(transform(10,test))  // 20
consoole.log(test(10)) //與上面寫法一樣答案,上面寫法就是多此一舉XD

例三還有另外一個例子,可看這邊

  1. 匿名函式 = 沒有名字的 function
    console.log(
        transform([1,2,3]), function(x) {
                return x*3
    })

什麼是 作用域(scope)?

[MTR01] Lesson1-2 JS基礎 (52:30處)

作用域代表一個變數的生存範圍 = 超過這個生存範圍,此變數就不存在了。

作用域分為:

  1. 全域 (global scope)
  2. 函式域(function scope)

以下例子為 function scope 無法再 global scope 中顯示:

function test() {
    var a = 1;
}

console.log(a)  //undefined

//undefined 是因為 a 只能生存在 funciton test() 裡,而且此 log(a) 超出 function 的範圍,表示不存在。

變數在不同 scope 裡的生存範圍:

var a = 10;  //全域變數
function test() {
    var a = 1;  //函式域變數
    console.log(a)  //prints 1
}
test();
console.log(a)  //prints 10

宣告變數時一定要加 var,否則 JavaScript 會把此變數自動改成全域變數,容易產生 bug :

var a = 1;  //全域變數

function test() {
    a = 10;  //自動變成全域變數,重新把 a 設成 10
    console.log(a)  //prints 1
}
test();
console.log(a)  //prints 10

參數(Parameter) vs 引數(Argument) + 引數跟你想的不一樣

什麼叫做引數? 引數就是真正傳進去的東西,如例子:

function add(a,b) {    // a,b 為參數
        return a+b
}

add(3,5) //引數為 3與5

在 javaScript 裡面有個很特別的東西是,只要將 Arguments 用 console.log() 出來,就會顯示出他的引數:

function add(a,b) {   
        console.log(arguments)  // {'0': 2, '1': 5}
        return a+b // 得7
}

add(3,5) 

以下寫法,答案與上面寫法一樣: (但很少用到)

function add() {   
        return arguments[0] + arguments[1]  // 得7
}

add(3,5) 

備註:

  1. arguments 為 javaScript 特有的!
  2. arguments 用 {}[] ,代表它其實是個物件,一個長得很像 array 的物件(類陣列,array-like)。

那如何判斷呢?

function add(a,b) {   
        console.log(Array.isArray(arguments)) // 得 false
        return a+b
}

consloe.log(add(2,5)) 

引數也可以用 .length

function add(a,b) {   
        console.log(arguments.length) // 得 2, 兩個數
        return a+b
}

consloe.log(add(2,5)) 

Function 傳參數的運作機制

有三種類型:

  1. pass by value
  2. pass by sharing
  3. pass by reference (但JavaScript 沒有)

    更深入,請點(還沒看XD)

function swap(a,b) { //想像 a = number1 , b = number2 var temp = a a = b b = temp console.log('a: ', a ,"b: ", b) }

console.log(number1, number2) swap(number1, number2) console.log(number1, number2) // 10 20 // a: 20 b:10 //10 20 (值並無改變)

- **物件和陣列,皆指向『同一個』『記憶體位置』,所以裡面有可能會改到外面的東西(如用 .a 的時候)**
```javascript
function addValue(obj) {
    obj.number++ //因為他們指向同一個物件,所以裡面的 obj 可以改到外面的 var a = {number: 10}
    return 1
}

var a = {
   number: 10
}

addValue(a)
conslole.log(a)   // 得 number: 11

再一題:

function addValue(obj) {
    obj = {
         number: 100
    }
    return 1
}

var a = {
   number: 10
}

addValue(a)
conslole.log(a) // 得 number: 10

原因:因為用指定新的變數,儲存的記憶體位置不同了!

return 不 return

return 有兩種:

  1. 不需要知道結果的
    
    function sayHello() {
    console.log('hello')
    // 這邊沒寫 return 沒關係,因為在函式裡面,它會自動預設回傳值(return)為 undefined
    }

sayHello() // 得 hello

2. 需要知道結果的,則需寫 return 
```javascript
function dbouble(x) {
   return x * 2
}
double(3) // 結果:空白

因為沒寫 console.log(double),所以無法顯示結果。

function dbouble(x) {
return x * 2
}
var result = double(3)
console.log(result)      // 得 6

備註:

必須注意一 return 就會跳回去 = 忽略下面的程式碼。

zuppachu commented 6 years ago

javaScript 內建函式 (method)

共有以下四種類型:Number 、Math、String、Array。


Number 類型的內建函式

將字串轉成數字:

  1. Number():轉換整個值,非部分的值

  2. parseInt(n, 幾進位):轉成整數

  3. parseFloat():轉成浮點數 (可看補充

var a = 10
var b = "20.123"

//可用 Number(b) 將字串變成數字
console.log(a + Number(b))  
// 得 30.123    

//或是用 parseInt(b,10) 將字串變成數字,10 表示 10 進位 
console.log(a + parseInt(b,10))  
// 得 30
var a = 10
var b = "20.3554735"

//字串變小數
console.log(a + parseFloat(b))   

//取小數後兩位,會四捨五入                        
console.log(parseFloat(b).toFixed(2)) 

//沒寫會取整數                
console.log(parseFloat(b).toFixed())

// parseFloat().toFixed() 結果輸出是字串,因為數字+字串                 
console.log(a + parseFloat(b).toFixed(2))           

// 得 30.3554735
// 得 20.36
// 得 20
// 得 '1020.36'

數字變成字串:

  1. .toString()
    
    var x = 123
    x.toString() //將變數x轉為字串"123"。

(123).toString() //將數字123轉為字串"123"。 (100 + 23).toString() //將表達式100+23計算後轉為字串"123"。

2.  String():強制轉換為 string - 可用於任何型態的數字、文字、變數、表達式、布林值。
```js
String(123)  //將數字123轉為字串"123"
String(100 + 23) //將表達式100+23計算後轉為字串"123"
String(tue) // "true"

String 類型的內建函式

.toUpperCase()

var word = 'hello world!'
console.log(word.toUpperCase())
// 得 HELLO WORLD!

var a = 'abcdef!!!g'.toUpperCase()
console.log(a)
// 變成大寫 ABCDEF!!!G ,符號不變。

.toLowerCas()

var b = 'HI!!!JKLMN'.toLowerCase()
console.log(b)
// 轉成小寫 hijklmn

還有其他種方式可以將『小寫轉大寫』,但首先得先知道什麼是 ASCII Code?

ASCII Code 是一種存在電腦上 文字 對應的 號碼(Unicode值)。

.charCodeAt()

返回在指定的位置字符的 Unicode 編碼 (A = 65 , B = 66 ... ; a = 97 , b = 98 ...)

var str = 'Aa'
var str1 = str.charCodeAt(0)      // .charCodeAt(n),n表示字串位置。
var str2 = str.charCodeAt(1)
console.log(str1, str2)
// A=65,a=97,相差32。

.fromCharCode()

同理,若想知道「數字」變成「文字」,可以用以下方法:

var str = String.fromCharCode(65)     //從 UTF-16 code 換回英文字母
console.log(str)
// 得 A

若不知道大小寫數值相差多少時,可以醬子:

var a = "g"
var aCode = a.charCodeAt(0)
var str = String.fromCharCode(aCode - ("a".charCodeAt(0)-"A".charCodeAt(0))) 

console.log(str)
// 得 G

若想用相差32來轉換大小寫:

var a = "g"
var aCode = a.charCodeAt(0)
var str = String.fromCharCode(aCode - 32)  //用 UTF-16 code 方式來轉換大小寫。
console.log(str)
// 得 G

判斷是否為大寫字母?

var char = "J"
console.log(char >= "A" && char <= "Z") 
// 得 true 

判斷是否為小寫英文字母?

var char = "j"
console.log(char >= "a" && char <= "z")
// 得 true

.indexOf() 找字串是否有出現?

var str = "hey hello world yoyoyo"

var index = str.indexOf("hello")
console.log(index)

var index = str.indexOf("hello!!")
console.log(index)
// 4 ,表示出現在第四個字元
// -1,負的表示沒出現在裡面

.replace() 換字

var str = "hey hello world yoyyoyo".replace("y", "!!!")  //只會換第一個 y
console.log(str)
// he!!! hello world yoyyoyo
var str = "hey hello world yoyyoyo".replace(/y/g, "!!!")  //全部 y 都會換
console.log(str)
// he!!! hello world !!!o!!!!!!o!!!o
var str="abc Def!"
console.log(str.replace(/abc/, "CBA"))//CBA Def!

.split() 切割字串:將字串轉為陣列,常用於讀取資料

var str = "hey hello world yoyyoyo"
console.log(str.split(" "))   //以空格來切割字串
console.log(str.split("y"))  //以 y 來切割字串
// [ 'hey', 'hello', 'world', 'yoyyoyo' ] 
// [ 'he', ' hello world ', 'o', '', 'o', 'o' ]

trim() 去掉前後空格

var str = "    data1, data2, data3, data4    "
console.log(str.trim())
// data1, data2, data3, data4

.length 知道字串長度 (沒有()因為不是函示)

var str ="data1, data2, data3, data4"
console.log(str.length)  
// 26 包含空格

str[i] 取出字串內的字

var str ="data1, "

for (var i = 0; i < str.length; i++){
    console.log(str[i])  //也可以像陣列用法,取出第n個字
}
// d
// a
// t
// a
// 1
// ,

.substr()

stirng 倒印出來的方式之一。

string.substr(起始點,length)  // length is optional

var str = 'mozilla'
console.log(str.substr(1,2)) 
console.log(str.substr(2)) 
console.log(str.substr(-1,1)) 
console.log(str.substr(-4,3)) 
// 'oz'
// 'zilla'
// 'a' (負數從後面算起)
// 'ill' (長度還是從前方算起)

補充: JavaScript字符串操作方法大全,包含ES6方法

JavaScript 變數宣告與作用域

Array 陣列類型的內建函式

.length

用來取陣列長度,非函式。

.join()

只存於陣列元素之間,將陣列轉為字串。

var arr = [1, 2, 3]
console.log(arr.join("!"))
console.log(arr.join(""))
console.log(arr.join(","))
// 1!2!3 
// 123
// 1,2,3

注意:輸出是字串喔!

.map(function) 將陣列變成想要的樣子

var arr =[1, 2, 3]
function double(x) {
    return x*2
}
console.log(arr.map(double))  
// => 會將每個元素都帶到 function 去,然後用 function 的回傳值取代回陣列原本的值
// [ 2, 4, 6 ] 輸出為陣列

輸出為陣列的話,可以無限加:

var arr = [1, 2, 3]
console.log(
    arr
    .map(function(x){
        return x*-1
    })
    .map(function(x){
        return x*3
    })
)
// 得 [ -3, -6, -9 ]

.filter() 篩選

var arr = [1, 2, 3, -6, 3, -5]
console.log(
    arr
    .map(function(x){
        return x*-1
    })
    .filter (function(x){
        return x>0
    })
)
// [ 6, 5 ]

.slice() 切陣列

var animals = ["ant", "bison", "camel", "duck", "elephant"]
console.log(animals.slice(2))        //從 2 開始切
console.log(animals.slice(2,4))    //從2開始切,切到 4 前

// [ 'camel', 'duck', 'elephant' ]
// [ 'camel', 'duck' ]

.splice() 插入或換元素到陣列中,會改變原本的陣列

var months = ["Jan", "March", "April", "Maya"]

months.splice(1, 0, "Feb")      //在1的位置,刪去0個,加入 “Feb”
console.log(months)
// [ 'Jan', 'Feb', 'March', 'April', 'Maya' ]

months.splice(4, 1, "May")     //在4的位置,刪去1個,換成 ”May"
console.log(months)
// [ 'Jan', 'Feb', 'March', 'April', 'May' ]

months.splice(4, 1)                 //在4的位置,刪掉1個,加入0個
console.log(months)
//[ 'Jan', 'Feb', 'March', 'April' ]

.sort() 排序陣列:會改變原本的陣列

數字的排序需注意

例一:

var months = ["March", "Jan", "Feb", "Dec"]
months.sort()

console.log(months)
// 得 [ "Dec", "Feb", "Jan", "March" ] ,按第一個英文字母排序
var number = [1, 30, 4 ,21]
number.sort()
console.log(number)

// [1, 21, 30 ,4] ,按第一個數字排列

例二,由小排到大(a<b):

方法一:

var arr = [1, 30, 4, 21] 
arr.sort(function(a,b)){ 
if(a === b) return 0
if(b>a) return -1   // 不換位置
return 1   // 換位置
}
console.log(array)
// 得 [1, 4, 21, 30 ]

方法二:

array1.sort(function (a, b) {
return a - b  // 正數要換位置
})
console.log(array)
// 得 [1, 4, 21, 30 ]

例三,由大排到小(a>b):

方法一:


var array1 = [1, 30, 4, 21]

array1.sort(function (a, b) { if (a === b) return 0 if (b > a) return -1 return 1 }) console.log(array1)

>方法二:
```javascript
var array1 = [1, 30, 4, 21]
array1.sort(function (a, b) {
  return b - a // 正數要換位置
})
console.log(array1)
// [ 30, 21, 4, 1 ]

方法三,三元運算子寫法:


var array1 = [1, 30, 4, 21]

arr.sort(function(a,b)) { if (a === b) return 0 return a>b ? -1 : 1 } console.log(array1) // 得 [30,21,4,1]

### reduce()
函式模樣:(初始值可以不用填,不填的預設為 0。)
```js
function(accumulator 累積器, currentValue目前的值){
  return currentValue + accumulator
}

可在 Lv1-10 檔案看用法和替換方式筆記

回傳陣列總和:

題目一

[1,2,3].reduce(function (accumulator, value){
  return accumulator + value
})
//得6

題目二

[1,2,3].reduce(function(accumulator, value){
  return accumulator + value
}, 10)
//得16

題目一其他寫法

var ans = 0;
[1,2,3].map(function(value){
ans = ans + value
return ans
})
console.log(ans)
var ans = 0;
[1,2,3].forEach(function(value){
ans = ans + value
})
console.log(ans)

其他小題

  1. 傳 obj
    
    console.log([1,2,3].reduce(
    function(obj, value){
       obj["a"+value] = value
           return obj
    }, {}
    ))

//得{a1: 1, a2: 2, a3: 3}

2. <5的數量
```js
console.log([1,2,3,4,5,10,20].reduce(
  function(count, value){
      if(value < 5){
          return count + 1
      }
      return count
  }, 0
))
//得4
  1. <5的加總
    console.log([1,2,3,4,5,10,20].reduce(
    function(count, value){
      if(value < 5){
          return count + value
      }
      return count
    }, 0
    ))
    //得10

    .forEach()

    把陣列元素都傳出來,例如:

    
    ['a', 'b', 'c'].forEach(function(x) {
    console.log(x);
    })

// "a" //"b" //"c"

---

## Math 內建函式

### Math.random()
產生 **0 <= n < 1 之間的隨機小數**,可以依需求乘倍數,例如:
```js
console.log(Math.random() * 10)  
//產生 0 <= 10n < 10 之間的亂數

可參考之前寫得更詳細的筆記

Math.floor()

往下取整數,無條件捨去小數點後面位數

console.log(Math.floor(1.9))  
//prints 1

Math.ceil()

往上取整數,無條件進位

console.log(Math.ceil(1.9))  
//prints 2

parseInt()

把字串變數字

var a = "50";
console.log(parseInt(a) === 50)  
//prints true

可以傳入第二個參數,指定要以哪一個進位為底

var a = "50";
console.log(parseInt(a, 10))  
//prints 50,以 10 進位為底

Math.sqrt()

開根號

console.log(Math.sqrt(9)) 
//prints 3 

Math.pow()

console.log(Math.pw(2,10))
// 2 的 10 次方,得 1024

補充資料

JavaScript字符串操作方法大全,包含ES6方法

zuppachu commented 5 years ago

迴圈 Loop

迴圈的前世: label 與 goto (不在 js 的語言裡)

var i = 1 loop or label: console.log(i) i++ if (i<=10) { goto loop } else { console.log('finished'); }

**control + c** => 強制關閉

## 下列方式可練習迴圈跑法:
> do... while... @12:20 分

1. 將 .js 檔案程式碼的頭和尾加上
```js
<script>
debugger
程式碼
</script>
  1. 複製整串到 .html ,然後存檔
  2. 在 google chrome 開此 .html 檔案
  3. 點 google chrome 上方 : 檢視 -> 開發人員選項 -> 開發人員工具 看 sources
  4. 按右邊箭頭 step 可一步一步看程式跑的方式
  5. 按 watch 的 + 輸入想觀察的變數
  6. 看答案條列式可點 console
  7. 按列數數字可作為中斷點標籤,按開始鍵會直接再 run 至中斷點

先做再說:do...while...

(先做再判斷條件)

var i = 1
do {
  console.log(i)
   i ++
} while (i<= 3)
console.log('end = ', i)
// 1
// 2
// 3
// end = 4

continue 跑到下一迴圈 break 停止跳掉,直接跳出迴圈

var i = 1
do {
  console.log(i)
   i ++
   if (i>100) {
    break
    }
} while (true)

console.log('i = ', i)
var i = 1
do {
     console.log(i)
      i ++
      if ( i % 2 === 1) {
       continue
      }
      console.log('偶數', i)
} while (i <= 4)
console.log('end:', i)
// 1
// 偶數 ㄉ

試圖擺脫無盡的輪迴:while

(先檢查條件再做)

var i = 1

while (i<=10) {
console.log(i)
i++
} 
console.log('i=', i)

for loop

for (初始值; 終止條件 ; i 每一圈要做的事) {

}
var i = 1
for (i=1 ; i<=4 ; i++) {
    console.log(i)
}
console.log('end', i)
// 1
// 2
// 3
// 4
// end : 5

var i = 1 if (i <= 4) { goto console.log(i)} console.log(i) i += 1

for (var i=1; i<5; i++) {
    if (i===3) continue
    console.log(i)
}
// 1
// 2
// 4
for (var i=1; i<5; i++) {
    if (i===3) break
    console.log(i)
}
// 1
// 2
var score = [10, 70, 90, 40]
for (var i = 0; i < score.length ; i++) {
    console.log(score[i])
}
// 10
// 70
// 90
// 40
var score = [10, 70, 90, 40]
var sum = 0
for (var i = 0; i < score.length ; i++) {
    sum += score[i]
}
console.log(sum)
// 210
var socre = [10, 70, 90 ,40]
var sum = 0 
var i = 0
while (i<socre.length) {
    sum += score[i]
    i ++
}
console.log(sum)
zuppachu commented 5 years ago

新手最會出錯的地方

一、 「回傳」與「印出」的差別?

function add(a,b){
    console.log(a,b)
    // return undefined
}

console.log(add(1,2))

// 1 2
// undefined

因為在 function 裡面 return 可加可不加,他的預設值都是 undefined

funciton add(a,b) {
 return a+b
}

add(1,2)

// 沒東西出現,因為沒寫 log,無法印出來。

return 只會回傳一個值,之後跳出 console.log() 印出東西 在 google dev tool 裡面,有個灰色小箭頭是回傳值(指令的回傳值),可以忽略不理。

二、 超級無敵重要的 Immutable 觀念 (不可變觀念)

除了 object (物件,陣列)外,其他都是不可變的 immutable values。

  1. String 為例:
    
    var str = "hello"
    str.toUpperCase() // 這樣寫對字串沒有用,不會改變原本的值。他一定會回傳一個新的值,所以須指定(創一個新的記憶體位置),如下
    str = str.toUpperCase()
    console.log(str)

// hello // HELLO

```js
var a = "hello"
a += "yo" // a = a + "yo",創一個新的記憶體位置,a 的原本質不變。因為記憶體位置不同。 

console.log(a)
// helloyo
  1. Function 為例: 呼叫 function 時,需注意它是會回傳新的值改變原本的值,或是兩著皆是。可查看 MDN 明白其中的差異

console.log(arr) // [1,2,4]

```js
var arr = [1,2]
newarr = arr.push(4)

console.log(newarr) // 表示新的長度
console.log(arr)
// 給出陣列的長度 : 3
// [1,2,4]

console.log(arr) console.log(newarr) // [2,1] // [2.1]


## 三、 拜託,請你愛用 console.log
```js
function isPrime(num) {
    if(num === 1) return false
    if(num === 2) return true

    for (var i = 2; i<num; i++) {
        if(num % i === 0) {
            return false
        } else {
            return true
        }   
    }

}

console.log(isPrime(2))
console.log(isPrime(17))
console.log(isPrime(37))
console.log(isPrime(14))
console.log(isPrime(15))  //這個答案錯誤,因數有 1,3,5,15。有 bug

該怎麼改呢?

function isPrime(num) {
    console.log('num', num)
    if(num === 1) return false
    if(num === 2) return true

    for (var i = 2; i<num; i++) {

        console.log('i', i)

        if(num % i === 0) {
            console.log('num % i === 0', num, i)
            return false
        } else {
            console.log('else', num, i)
            return true
        }   
    }

}

console.log(isPrime(2))
console.log(isPrime(17))
console.log(isPrime(37))
console.log(isPrime(14))
console.log(isPrime(15)) //這個答案錯誤,因數有 1,3,5,15。有 bug
> num 15
> i 2
> else 15 2
> true

正確改法:

function isPrime(num) {
    console.log('num', num)
    if(num === 1) return false
    if(num === 2) return true

    for (var i = 2; i<num; i++) {

        console.log('i', i)

        if(num % i === 0) {
            console.log('num % i === 0', num, i)
            return false
        }   
    }
    return true
    //迴圈裡面沒有一個數字可以整除,代表這個數字是質數(除了1和該數自身外,無法被其他自然數整除的數)。
}