> 如果有記憶吐司就好了...
# 何謂物件取值?
物件本身的屬性都是字串,字串可包含很多種字元,例如:數字 **"1"** 、特殊字元 **"&deposit"** 、文字 **"居住城市"** ...等等。因此,當我們要取物件內的值時,可以用以下兩種方法。
## 用 . 取值
輸入物件名稱加 **.** 後面放入屬性名稱。
```
let family = {
motherName: "Mary",
"&deposit": 100000,
1: "1",
居住城市: "台中市"
};
console.log(family.motherName); // Mary
console.log(family."&deposit"); // 報錯
console.log(family.居住城市); // 台中市
console.log(family.1); // 報錯
```
## 用 [] 取值
輸入物件名稱加上 **[]** ,中括弧內用單/雙引號包住屬性名稱,若屬性開頭是數字可不加單/雙引號,若是變數則不須加引號。
```
let family = {
motherName: "Mary",
"&deposit": 100000,
1: "1",
居住城市: "台中市"
};
console.log(["motherName"]);// Mary
console.log(["&deposit"]);// 100000
console.log(["1"]);// 1
console.log(["居住城市"]);// 台中市
```
### 當我在物件外面又宣告了一個變數,並賦予物件內的屬性,此時我要如何取變數被賦予屬性的值呢?
```
let family = {
motherName: "Mary",
"&deposit": 100000,
1: "1",
居住城市: "台中市"
};
let a = "motherName";
console.log(a); // 回傳motherName
console.log(family.a); // 回傳undefined
console.log(family[a]); // 回傳Mary
```
### 發生了什麼事呢??
**console.log(a) -** 僅是印出變數a被賦予的值,而不是屬性內的值。
**console.log(family.a) -** 用 **.** 取值,僅會找到該物件family內去找尋對應的屬性名稱,若沒有則回傳undefined。
**console.log(family[a]) -** 用 **[]** 取值,不僅會找到該物件family內找尋對應的值,還會在物件外找尋對應的變數,並幫您帶入至物件內
```
let family = {
motherName: "Mary",
"&deposit": 100000,
1: "1",
居住城市: "台中市"
};
let a = "motherName";
console.log(family[a]);
// 當物件內沒有找到對應的a,則往外找到變數a
// let a = "motherName";
// 此時a就被放入物件內,而找到對應屬性的值並回傳Mary
// let family = {
// a: "Mary",
// "&deposit": 100000,
// 1: "1",
// 居住城市: "台中市"
// };
```
## 結語
**用 . 取值** - 比較簡單的方式,但只限於取一般文字字串,若使用於開頭為數字or特殊字元時,會回傳錯誤。
**用 [] 取值** - 比較全面的一種方式,可以取代用 **.** 取值,基本上可以取物件內各式各樣的屬性。
參考資料:
[JavaScript 核心篇 學習筆記: Chap.30 — 物件取值,新增與刪除](https://medium.com/@yining1204/javascript-%E6%A0%B8%E5%BF%83%E7%AF%87-%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98-chap-30-%E7%89%A9%E4%BB%B6%E5%8F%96%E5%80%BC-%E6%96%B0%E5%A2%9E%E8%88%87%E5%88%AA%E9%99%A4-b7a3a37a6bd7)
[何謂物件取值?在什麼時機上會用到?點(.)和方括號([])取值的不同之處](https://hackmd.io/PgcOSX3DQui5Iex2UVmdgQ)
[何謂物件取值?在什麼時機上會用到?點和方括號取值的不同之處](https://hackmd.io/@LRcGdkjGRvKUfXFwuV2JVA/B14kVlS8K)