`#JavaScript` `#六角前端課程` `#學習筆記` `#骨力走傱`
## 陣列進階操作
### 新增
#### `unshift`
```javascript=
let arr = [1, 2, 3];
arr.unshift(0);
console.log(arr); // [0, 1, 2, 3];
```
* `變數.unshift ( 要寫入的值 );`
* `unshift` 為 JavaScript 提供的方法,可將資料寫入至陣列**前端**。
### 刪除
#### `shift`
```javascript=
let arr = ["red", "pink", "blue"];
arr.shift();
console.log(arr); // ["pink", "blue"];
```
* `變數.shift ( 空白 );`
* 刪除陣列中,**第一筆**資料。
#### `pop`
```javascript=
let arr = [a, b, c];
arr.pop();
console.log(arr); // [a, b];
```
* `變數.pop ( 空白 );`
* 因為是要刪除資料,故 `()` 空白即可。
* 刪除陣列中,**最後一筆**資料。
### 新增與刪除
#### `splice`
```javascript=
let pets = ["cat", "dog", "fish"];
pets.splice(3, 1, "brid");
console.log(pets); // ['cat', 'dog', 'fish', 'brid']
```
* `變數.splice( 參數一, 參數二, 參數三 );`
* 參數一:刪除對象的索引值。
* 參數二:刪除幾筆(包含自己)。
* 參數三:要新增的內容。
* `pets.splice(3, 1, "brid");` 表示刪除陣列中,索引值為 3 的值,刪除一筆,並寫入 `"brid"`。
* 可以只寫 `pets.splice(0, 1);`,表示只有刪除的功能,未寫入新的值。
### 取得長度
#### `length`
```javascript=
let foods = ["beef", "pork", "chicken"];
console.log(foods.length); // 3
```
* `變數.length`
* `length` 也可以應用在取得最後一筆資料。
* `foods[foods.length-1]; // "chicken"`
## 物件進階操作
### 修改
#### `.`
```javascript=
let band = {
musicGenre : "rock",
bassNum : 1,
guitarNum : 1,
drumNum : 1,
};
band.musicGenre = "post-rock";
band.guitarNum += 1;
console.log(band); // {musicGenre: 'post-rock', bassNum: 1, guitarNum: 2, drumNum: 1}
```
* `變數.屬性名稱 = 要修改的值;`
### 刪除
#### `delete`
```javascript=
let band = {
musicGenre : "rock",
bassNum : 1,
guitarNum : 1,
drumNum : 1,
};
band.musicGenre = "post-rock";
delete band.guitarNum;
console.log(band); // {musicGenre: 'post-rock', bassNum: 1, drumNum: 1}
```
* 使用 `delete` 運算子,刪除物件中的屬性。
### 讀取資料
#### 使用點記法 `.` 讀取
```javascript=
let band = {
musicGenre : "rock",
bassNum : 1,
guitarNum : 1,
drumNum : 1,
};
console.log(band.musicGenre); // rock
```
* 可以使用 `.` 讀取物件中屬性的資料。
#### 使用括弧記法 `[""]` 讀取
```javascript=
let band = {
musicGenre : "rock",
bassNum : 1,
guitarNum : 1,
drumNum : 1,
};
console.log(band["musicGenre"]); // rock
```
* `變數["屬性名稱"];`
* 若使用 `[]` 讀取屬性資料,記得加上 `""`,否則會被電腦視為變數,那又是另一種讀取的方法了。
#### 使用 `[變數]` 讀取
```javascript=
let band = {
musicGenre : "rock",
bassNum : 1,
guitarNum : 1,
drumNum : 1,
};
let type = "musicGenre";
console.log(band[type]); // rock
```
* 可以將屬性名稱賦值在一個變數上,若要讀取 `"rock"` 這個值,語法為 `band[type]`,也就是 `物件變數[儲存屬性值的變數]`。
* 此時 `type` 指向了 `band` 的記憶體位置(傳址特性),因此可以用 `band[type]` 讀取 `"rock"`。
* 這個讀取方式稱為**動態取值**,在進階應用上經常出現。
### 如何操作非英文字母的屬性名稱?
#### 修改
```javascript=
let band = {
musicGenre : "rock",
bassNum : 1,
guitarNum : 1,
drumNum : 1,
};
band["吉祥物"] = "土虱";
console.log(band); // {musicGenre: 'rock', bassNum: 1, guitarNum: 1, drumNum: 1, 吉祥物: '土虱'}
```
#### 讀取
```javascript=
let band = {
musicGenre : "rock",
bassNum : 1,
guitarNum : 1,
drumNum : 1,
"吉祥物" : "土虱"
};
console.log(band["吉祥物"]); // 土虱
```
* 屬性名稱為非英文字母、空格、特殊符號時,必須使用 `[""]` 讀取,否則語法會錯誤。
* 相對的,若寫入的資料也是上述情形,必須使用 `[""]` 寫入資料。
## 陣列與物件的混合應用
### 範例
> 描述市場裡的攤位。
```javascript=
let mark = [
{
bossName: "Tom",
sale: "fruit",
isOpen: false
},
{
bossName: "Peter",
sale: "fish",
isOpen: true
}
];
console.log(mark);
// {bossName: 'Tom', sale: 'fruit', isOpen: false}
// {bossName: 'Peter', sale: 'fish', isOpen: true}
```
### 讀取
#### 請讀取第一筆物件資料
```javascript=
let mark = [
{
bossName: "Tom",
sale: "fruit",
isOpen: false
},
{
bossName: "Peter",
sale: "fish",
isOpen: true
}
];
```
* `console.log(mark[0]); // {bossName: 'Tom', sale: 'fruit', isOpen: false}`
#### 請讀取第二筆物件中 sale 的資料
```javascript=
let mark = [
{
bossName: "Tom",
sale: "fruit",
isOpen: false
},
{
bossName: "Peter",
sale: "fish",
isOpen: true
}
];
```
* `console.log(mark[1].sale); // fish`
#### 小結
| | 讀取方法 | 備註 |
| ---- | -------- | ---------------------------------------- |
| 陣列 | `[]` | 使用索引值表示,要查詢陣列中第幾筆資料。 |
| 物件 | `.` | 用 `.` 讀取屬性名稱儲存的值。 |
## JSON
### 介紹
* JSON(JavaScript Object Notation)是一種輕量級資料交換格式。
* 雖然以 JavaScript 語法為基礎,但可獨立使用,許多程式語言可讀取並產生 JSON。
* 經常用於傳遞與儲存資料,例如前、後端交換資料,或與 API 交換資料。
#### 資料來源
* [使用 JSON 資料](https://developer.mozilla.org/zh-TW/docs/Learn_web_development/Core/Scripting/JSON)
### 讀取
```json=
[
{
Kind: "公共充電站",
Charge: "免費",
Location: "新興區公所 ",
Address: " 高雄市新興區中正三路34號1樓(室內停車場)"
},
{
Kind: "公共充電站",
Charge: "免費",
Location: "高雄市民權停車場(機車停車場) ",
Address: " 高雄市新興區民權一路221號"
},
{
Kind: "公共充電站",
Charge: "免費",
Location: "為鑫機車行 ",
Address: " 高雄市新興區民族二路126號"
}
];
```
由於 JSON 的基礎是 JavaScript,因此資料格式非常類似,可以將 JSON 賦值在變數上,並透過陣列或物件的方法,讀取需要的資料。
### 篩選
> 試著篩選出第三筆資料
#### 資料
```json=
[
{
Kind: "公共充電站",
Charge: "免費",
Location: "新興區公所 ",
Address: " 高雄市新興區中正三路34號1樓(室內停車場)"
},
{
Kind: "公共充電站",
Charge: "免費",
Location: "高雄市民權停車場(機車停車場) ",
Address: " 高雄市新興區民權一路221號"
},
{
Kind: "公共充電站",
Charge: "免費",
Location: "為鑫機車行 ",
Address: " 高雄市新興區民族二路126號"
}
];
```
#### 處理結果
```javascript=
let data = [
{
Kind: "公共充電站",
Charge: "免費",
Location: "新興區公所 ",
Address: " 高雄市新興區中正三路34號1樓(室內停車場)"
},
{
Kind: "公共充電站",
Charge: "免費",
Location: "高雄市民權停車場(機車停車場) ",
Address: " 高雄市新興區民權一路221號"
},
{
Kind: "公共充電站",
Charge: "免費",
Location: "為鑫機車行 ",
Address: " 高雄市新興區民族二路126號"
}
];
let obj = data[2];
console.log(obj); // {Kind: '公共充電站', Charge: '免費', Location: '為鑫機車行 ', Address: ' 高雄市新興區民族二路126號'}
```
## 與邏輯判斷的混合應用
### 範例
> 觀察客人體溫。
```javascript=
let flixStatus = {
name : "Flix",
age : "18",
status: ""
};
flixStatus.degree = 37;
if (flixStatus.degree >= 37.5) {
console.log("您不得進入。");
flixStatus.status = "您不得進入。" // 寫入狀態
} else {
console.log("您可以進入。");
flixStatus.status = "您可以進入。" // 寫入狀態
};
console.log(flixStatus); // {name: 'Flix', age: '18', status: '您可以進入。', degree: 37}
```