---
title: 20200813 Astro camp Javascript
tags: Astro Camp, javascript,
---
# 20200813 Astro camp Javascript
### 請參考[PPT](https://reurl.cc/odDg1M)
## 函式
1. 不檢查參數數量
2. 無論如何會接收環境參數
3. destructive assgiment
> 額外補充
> addEventListener 鍵盤事件:
> `key down` 按下鍵盤後(持續)
> `key up` 離開鍵盤後
> `key press` 按下+離開算一次
>
函式有點像半透膜,外面的變數會進來,裡面的變數出不去!
### Destructive assignment
1. array with Destructive assignment
2. Object with Destructive assignment
(Ruby沒有Hash with Destructive assignment)
```javascript=
let ary = [1, 2, 3, 4, 5];
// 一般寫法
let first = ary[0] //印出1
let second = ary[1] //印出2
// Destructive assignment 寫法
let ary = [1, 2, 3, 4, 5];
let [first, second, third] = ary;
//會去比較左右兩邊有類似的結構,ary就會被拆開,指派給左邊的變數
console.log(third) // 印出3
//也可以用...來變化
let [head, ...tails] = ary;
console.log(head); //印出1
console.log(tails); //印出5
//結合 Object (ruby的Hash)
let student = {name: 'john', age: 13, gender: 'M'};
//一般寫法
let studentName = student.name;
let studentAge = student.age;
// Destructive assignment 寫法
let {name: studentName, age: studentAge} = student;
// 當key跟我想要命名的變數同名時,可以在簡短成(省略key)
let {name, age} = student;
console.log(name); //印出john
console.log(age); //印出13
function baz({name, gender, age: studentAge}) { //變數順序無關
// do somehting with name and gender
console.log(name);
console.log(gender);
console.log(studentAge);
}
baz(student) // <- 呼叫時傳參數進去,而function只要求name,gender,age等變數。
```
for of 語法(類似forEach或each)
of後面接類似array的東西
```javascript=
for(let el of document.querySelectorAll('.inputCol')) {
el.addEventListener('keypress', (event) => {
let {keyCode, srcElement} = event;
if (keyCode === ENTER) {
checkInputAndLogin(srcElement.id);
}
})
}
```
反向寫法,可以省略掉很多if
` if (srcElementId !== 'password') { return; }`
## 集合
1. Array
2. key-value
3. set
4. Tuple
### Array 簡報(10)
#### array.join()
```javascript=
let names = ['apple', 'banana', 'cherry'];
let joinedNames = names.join();
console.log(joinedNames);
//印出 apple,banana,cherry
let joinedNames = names.join('\n');
console.log(joinedNames);
//印出
//apple
//banana
//cherry
```
#### indexOf()
#### concat()
#### FIFO(queue)
first in first out
#### LIFO(stack)
last in first out
> 查文件時:
> Array開頭的,是要傳整包array的東西進去(ex.[1, 2, 3])
> array開頭的,是傳array裡的element進去(ex.[1,2,3]裡的1)
> static method 不會影響到本身的array
> mutation method會改變原本的array
> 同場加映:
> querySeletorAll選到的東西,是一包類似array卻非array的東西,有順序卻沒有map方法。
>
## Set
有點像array不過內容不能重複
## Tuple 簡報(30)
將Object轉成Tuple
```javascript=
// Object.entries
let pricesByCountry = {
'tw': 300,
'us': 10.2,
'jp': 1250,
}
let result = Object.entries(pricesByCountry)
.map(tpl => [tpl[0], tpl[1] * 1.05])
let newPrice = Object.fromEntries(result)
console.log(newPrice)
```
能用計算出來的不要把它放在資料結構裡
如果物品價格跟成立訂單的價格不一樣
```javascript=
let products = [
{
id: 1, name: 'macbook', inventory: 100, price: 28000
}
]
let order = {
orderDateTime: '',
items: [
{id: 1, productId: 1, qty: 2,} //若這邊不放價格,之後產品價格改變時,資料庫裡已成立的清單價格會跟著一起改
]
}
```