---
# System prepended metadata

title: Javascript學什麼？

---

# Javascript學什麼？

### Array.forEach()
若我需要針對一個陣列內的所有資料逐一更改，可以用此方法來免於重複手段，範例如下：
```
let student = ["大雄","靜香","胖虎","小夫"];

student.forEach(function(item,index){
    student[index] += "同學";
});

console.log(student);    //['大雄同學','靜香同學','胖虎同學','小夫同學']
```
---
# 學習筆記
```
let ordered = ["牛肉串","雞皮","羊肉串","花椰菜"];

let bills = ordered.map(function(item,index){
    switch(ordered[index]){
        case "牛肉串":
        case "雞肉串":
        case "豬肉串":
        case "羊肉串":
            return 50;
        
        case "雞屁股":
        case "雞心":
        case "雞皮":
            return 45;
        
        case "花椰菜":
        case "節瓜":
        case "青椒":
            return 40;
        
    }
    
});
let sum = 0;
for (let i = 0; i < bills.length; i++) {
    sum += bills[i];
}


console.log(sum);
```

物件的屬性宣告在function之中要記得寫完整!
```
friends                    (x
facebookProfile.friends    (o
```
```
let facebookProfile = {
    name : "Wilson",
    friends : 20,
    messages : ["Hello!","Hi"],
    
    postMessage : function(message){
        facebookProfile.messages.push(message);
    },
    deleteMessage : function(index){
        facebookProfile.messages.splice(index,1);
    },
    addFriend : function(){
        facebookProfile.friends++;
    },
    removeFriend : function(){
        facebookProfile.friends--;
    }
}
```
### Advanced array
有空來寫一下關於array常用的方法
array.splice(index,1)
array.reduce()
array.filter()
關於pass by reference
```
let array1 = [1,2,3];
let array2 = array1;

array2 = [].concat(array1);    // 
```

> 忘記Array有什麼用法？參考這篇
> https://sdras.github.io/array-explorer/
### Advenced object
關於pass by reference
```
let obj1 = {
    name: 'ONE',
    weapon: {
        name: '單手劍'
    }
};
let obj2 = obj1;                                //將obj1的記憶體位址指向obj2
let obj3 = {...obj1};                           //clone一份obj1打包給obj3，僅複製第一層
let obj4 = JSON.parse(JSON.stringify(obj1));    //clone一份obj1打包給obj4，完全複製

obj2.name = 'TWO';       //變更obj2的屬性及obj2中物件的屬性
obj2.weapon.name = '鐵斧';

console.log(obj1,obj2,obj3,obj4)
obj1                    //因為obj2指向obj1的記憶體位址，故變更也會影響obj1
{name :'TWO'
 weapon {name :'鐵斧'}
}
obj2                    
{name :'TWO'
 weapon {name :'鐵斧'}
}
obj3                    //因為是clone的物件，故不會被obj1的改變受影響，但是物件中的物件還是會被影響
{name :'ONE'
 weapon {name :'鐵斧'}
}
obj4                    //他是完全獨立的物件，故不會被obj1影響
{name :'ONE'
 weapon {name :'單手劍'}
}


```

### Advanced function

#### closures
What doe's `addToTenAndThree` return?
```
const addTo = x => y => x + y;
const addToTen = addTo(10);
const addToTenAndThree = addToTen(3);
```
:::spoiler solution
```
addTo = x => y => x + y    //看作addTo(x) => y => x + y
addTo(x) => y => x + y     //看作addTo(x)(y) => x + y
```
> 關於colsures參考這篇
> https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Closures

:::
#### currying
#### compose

### DOM


### 前、後端的資料傳遞
query string        （不安全的
body form data      （不安全的

JSON (JavaScript Object Notation)
是種適用於client & server之間傳遞的文字格式，可以被各種語言閱讀，轉換成前後端各自的語言來運行
```
JSON.stringify()    /將Javasvript物件或值轉換成JSON格式
JSON.parse()        /將JSON格式轉換成Javascript物件或值
```

```javascript=
// 暫存
const temp = 'string';
```

```jsonld=
{
    
}
```


> 關於箭頭函數表示？參考這篇
> https://www.casper.tw/javascript/2017/12/21/javascript-es6-arrow-function/

### AJAX
AJAX 的全名是：Asynchronous JavaScript and XML，有沒有看到開頭那個 A 的全名是：Asynchronous，就代表是非同步送出 Request 的意思。

Promise

> 討論關於synchronous,asynchronous,blocking,non-blocking
> 參考這篇
> https://github.com/aszx87410/blog/issues/49


# React學什麼？
透過NPM下載create-react-app套件，以實現快速建構開發環境（此套件是基於webpack + ES6）
使用以下指令
```
npx create-react-app my-app
cd my-app
npm start
```

下載完成切換該目錄後執行它即可！

> React v18以後,不再使用ReactDOM.render,使用ReactDOM.createRoot取代