# 陣列&物件
==從最外層判斷是 [ 陣列 ] 或 { 物件 }==
:::info
陣列使用時機: 當資料需要使用大量且同性質的資料
:::
:::info
物件使用時機: 要描述一個東西對應的特徵和行為
:::
## 陣列
* 開頭使用[ ]
* 適合放集合資料
* 裡面放行別資料
### 語法
```javascript=
let color1 = 'red';
let color2 = 'blue';
let color3 = 'black';
const colors = ['red', 'blue', 'black'];
console.log(colors.length);//抓取長度
//會印出3,陣列在讀取是從0開始做計算
```
### 新增陣列
> 要依據當下情境來決定是要使用unshift or push
```javascript=
const colors = ["red", "blue", "black", "pink"];
colors.unshift("white");
//呈現結果為 white, red, blue, black, pink
//將新增的資料新增到最新一筆 例如最新消息
const colors = ["red", "blue", "black"];
colors.push("pink");
//呈現結果為 red, blue, black, pink
//將新增的資料新增到最後一筆 例如排名
```
### 讀取陣列長度
```javascript=
let color1 = 'red';
let color2 = 'blue';
let color3 = 'black';
const colors = ['red', 'blue', 'black'];
console.log(colors.length);
//會印出3,陣列在讀取是從0開始做計算
```
### 刪除陣列 shift or pop
> 依據當下情境來決定是要使用 shift or pop
> 刪除第一筆資料用 shift
> 刪除最後一筆資料用 pop
```javascript=
let colors = ['red', 'blue', 'black'];
colors.shift();
console.log(colors);
//會印出['blue', 'black']
```
```javascript=
let colors = ['red', 'blue', 'black'];
colors.pop();
console.log(colors);
//會印出['red', 'blue']
```
### 刪除陣列 splice
> 第一個數字代表起始位置
> 第二數字代表要往後刪除幾筆資料
```javascript=
const colors = ['red', 'blue', 'black'];
colors.splice(1,1);
```
## 物件
* 開頭使用大括號 { }
* 講解詳細資料
### 物件屬性存取
> 物件的屬性可以透過 . (注意,是點非逗號)來進行存取:
### 語法
#### 第一種寫法
```javascript=
const personStatus = {
//屬性 值
name: 'Sara',
height: 160,
isWearJacket: false
}
console.log(personStatus.name);
//會印出Sara,會讀取personStatus的.name
```
#### 第二種寫法
```javascript=
const personStatus = {
//屬性 值
name: 'Sara',
height: 160,
isWearJacket: false
}
console.log(personStatus["name"]);
//會印出Sara,會讀取personStatus的.name
//變數使用[""],這樣可以取變數的值
```
:::info
第二種寫法的好處為,當物件的索引鍵剛好剛好是不好法的JavaScript的識別字(如帶有空白的字串或是數字)時,執行就會出現錯誤,例如下方物件為"001"的字串
:::
```javascript=
let obj = {
"001": "Hello"
}
obj.001; //SyntaxError: Unexpected number
obj["001"]; //"Hello"
```
此時用obj.001就會發生錯誤,必須改用以obj["001"]的發誓才能正確存取。
```javascript=
let home = {
motherName: "Mary";
fatherName: "Tom";
cats: 4;
}
let motherCat = home.cats; //新增一個屬性名為motherCat,他會讀取home.cats得值,讀取到為4,因此會回傳4的值
console.log(motherCat)//4
```
### 屬性增加
若想為物件新增屬性的話,與變數一樣,直接用 = 指定就可以了:
```javascript=
const personStatus = {
//屬性 值
name: 'Sara',
height: 160,
isWearJacket: false
}
personStatus.notebook = "Mac";
//會新增一筆.notebook: "Mac" 在物件中
```
```javascript=
let home = {
motherName: "Mary";
fatherName: "Tom";
cats: 4;
}
let motherCat = home.cats; //新增一個屬性名為motherCat,他會讀取home.cats得值,讀取到為4,因此會回傳4的值
console.log(motherCat)//4
```
### 修改屬性
```javascript=
const personStatus = {
//屬性 值
name: 'Sara',
height: 160,
isWearJacket: false
}
personStatus.notebook = "Win";
//會新增一筆.notebook: "Win" 在物件中
```
### 屬性刪除
要是想刪除屬性,則是透過 delete 關鍵字來刪除:
```javascript=
const personStatus = {
//屬性 值
name: 'Sara',
height: 160,
isWearJacket: false,
notebook = "Mac"
}
delete personStatus.notebook;
//會刪除一筆.notebook: "Mac" 在物件中
```
### 物件裡面還能包物件
```javascript=
let home = {
motherStatus:{
name: "Mary",
age: 32
}
cats: 4;
}
console.log(home.motherStatus.age)//32
```
Object.keys(), Object.values() 使用練習
---
* Object.keys() 可以取得指定物件的所有 key 值,並回傳一個陣列。
* Object.values() 可以取得指定物件的所有 value 值,並回傳一個陣列。
```js=
const object1 = {
a: "字串",
b: 42,
c: false
};
console.log(Object.keys(object1)); // 結果: ["a", "b", "c"]
console.log(Object.values(object1)); // 結果: ["字串", 42, false]
```
## 取值的口決
:::success
物件用 . 陣列 [ 0 ]
看到物件用 . 進去尋找屬性,看到陣列用中括號去取值
:::